Generator systemd service
Uruchom aplikację jako usługę systemową
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator jednostki systemd
Systemd zarządza usługami w nowoczesnych dystrybucjach Linuksa. Dzięki jednostce .service Twoja aplikacja uruchomi się automatycznie i wznowi po awarii.
Sekcje pliku
| Sekcja | Zawartość |
|---|---|
| [Unit] | opis i zależności (After) |
| [Service] | polecenie, użytkownik, restart |
| [Install] | kiedy usługa startuje (WantedBy) |
Polityka restartu
always— zawsze po zakończeniu.on-failure— tylko przy błędzie.no— bez automatycznego restartu.
Przykład wdrożenia
sudo cp myapp.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now myapp journalctl -u myapp -f
Jak działa generator jednostki systemd
Generator zamienia wartości, które podajesz w formularzu — nazwę usługi, polecenie uruchomieniowe, użytkownika, politykę restartu, opóźnienie RestartSec, typ jednostki oraz moment startu — na gotowy plik jednostki w formacie INI, który systemd odczyta po skopiowaniu do katalogu systemowego. Narzędzie nie łączy się z Twoim systemem ani nie sprawdza, czy podane ścieżki istnieją; pełni rolę składniowego szablonu, który eliminuje literówki w nazwach sekcji i dyrektyw.
Mechanizm opiera się na trzech blokach. Sekcja [Unit] zawiera opis i zależności, sekcja [Service] definiuje sposób uruchomienia procesu, a sekcja [Install] mówi, kiedy usługa ma być włączana. Generator wypełnia je na podstawie pól formularza i pilnuje, aby dyrektywy takie jak Type, User, Restart czy RestartSec trafiły do właściwej sekcji — systemd zignoruje bowiem dyrektywę wpisaną w złym miejscu.
Logika warunkowa dotyczy przede wszystkim typu. Przy Type=simple systemd uznaje, że proces główny działa na pierwszym planie i nie kończy się od razu. Przy Type=forking oczekuje, że proces rodzicielski zakończy pracę, a usługa pozostanie w tle. Od tego wyboru zależy, czy systemd poprawnie rozpozna stan aktywności i czy polityka restartu zadziała w oczekiwanym momencie.
Przykład krok po kroku
- W polu nazwy usługi wpisujesz myapp. Generator tworzy z tego nazwę pliku myapp.service oraz nazwę jednostki używaną w poleceniach systemctl.
- Jako polecenie uruchomieniowe podajesz /usr/bin/myapp --config /etc/myapp.conf, a jako użytkownika www-data. Dzięki temu proces nie działa z uprawnieniami roota.
- Wybierasz Type=simple, ponieważ aplikacja działa na pierwszym planie i nie odłącza się sama od terminala.
- Ustawiasz Restart=on-failure oraz RestartSec=5. Usługa wznowi działanie po błędnym zakończeniu, ale dopiero po 5 sekundach przerwy, co chroni przed pętlą natychmiastowych restartów.
- W sekcji [Install] wybierasz WantedBy=multi-user.target. To wystarczy, aby usługa startowała przy normalnym uruchomieniu systemu.
- Otrzymany plik kopiujesz do /etc/systemd/system/myapp.service, następnie wykonujesz systemctl daemon-reload i systemctl enable --now myapp. Sprawdzenie stanu: systemctl status myapp.
Dyrektywy i ich znaczenie
| Dyrektywa | Sekcja | Znaczenie |
|---|---|---|
| Description | [Unit] | Krótki opis usługi widoczny w systemctl status. |
| After | [Unit] | Kolejność startu względem innych jednostek, np. network.target. |
| Type | [Service] | Sposób działania procesu: simple, forking, oneshot lub notify. |
| ExecStart | [Service] | Bezwzględna ścieżka polecenia uruchamiającego usługę. |
| User | [Service] | Konto, na którym działa proces; puste oznacza roota. |
| Restart | [Service] | Polityka restartu: always, on-failure lub no. |
| RestartSec | [Service] | Opóźnienie w sekundach przed kolejną próbą restartu. |
| WantedBy | [Install] | Target, który włącza usługę przy starcie systemu. |
Praktyczne wskazówki
- Zawsze podawaj pełną ścieżkę w ExecStart — systemd nie korzysta z PATH powłoki, więc samo myapp zwykle zakończy się błędem.
- Dobierz typ do zachowania procesu: dla aplikacji na pierwszym planie wybierz simple, dla klasycznych daemonów odłączających się od terminala — forking.
- Nie ustawiaj zbyt krótkiego RestartSec przy Restart=always. Zbyt szybkie restarty obciążają CPU i mogą zamaskować rzeczywistą przyczynę awarii.
- Testuj jednostkę przed włączeniem poleceniem systemctl start, a dopiero potem używaj enable, aby usługa nie startowała automatycznie z błędną konfiguracją.
- Pamiętaj o daemon-reload po każdej zmianie pliku .service — bez tego systemd nadal używa starej definicji.
Ograniczenia narzędzia
- Nie sprawdza ścieżek ani uprawnień — generator nie wie, czy plik podany w ExecStart istnieje i czy użytkownik ma prawo go uruchomić.
- Nie waliduje składni względem wersji systemd — niektóre dyrektywy są dostępne dopiero w nowszych wersjach, a narzędzie tego nie rozróżnia.
- Nie uwzględnia zależności pośrednich — wpisanie After=network.target nie gwarantuje, że sieć jest w pełni gotowa; to wymaga dodatkowej analizy jednostek.
- Nie generuje sekcji opcjonalnych takich jak [Socket], [Timer] czy dyrektyw środowiskowych EnvironmentFile; dla nich trzeba przygotować plik ręcznie.
Kiedy generator jednostki systemd realnie się przydaje
- Wdrożenie aplikacji z własnym środowiskiem — gdy program działa w virtualenv, z katalogu node_modules albo z lokalnie zbudowanego binarium, sprawdź ścieżkę do interpretera w ExecStart, katalog roboczy oraz zmienne środowiskowe. Te ostatnie wpisujesz jako osobne dyrektywy Environment, a nie doklejasz do polecenia.
- Migracja ze skryptu startowego — zastępujesz wpis w rc.local, skrypt z katalogu init.d albo zadanie z crona uruchamiane po restarcie. Sprawdź, czy polecenie nie korzysta z potoków, przekierowań i zmiennych powłoki, bo systemd nie uruchamia powłoki.
- Zadanie jednorazowe przy starcie — montowanie zasobu sieciowego, przygotowanie katalogów, migracja bazy. Wybierz Type=oneshot, a gdy usługa ma pozostać uznana za aktywną po zakończeniu pracy, włącz RemainAfterExit. Kolejność ustal przez After i Requires.
- Usługa zależna od sieci — serwer API, worker kolejki, aplikacja pobierająca dane z zewnątrz. Sprawdź, czy wystarczy network.target, czy potrzebne jest network-online.target razem z Wants, ponieważ samo After nie wymusza czekania na gotowość sieci.
- Audyt cudzej konfiguracji — przepisujesz istniejącą jednostkę z serwera do formularza, żeby zobaczyć, w których sekcjach powinny znaleźć się poszczególne dyrektywy, i porównać wynik z plikiem, który faktycznie działa.
Najczęstsze błędy przy generowaniu jednostki
Najczęstszy błąd to traktowanie ExecStart jak wiersza poleceń powłoki. Systemd dzieli tę wartość na argumenty samodzielnie, więc potoki, łączenie poleceń i przekierowania nie zadziałają, a ścieżka ze spacją rozsypie się na kilka argumentów. Jeśli naprawdę potrzebujesz logiki powłoki, wywołaj jawnie interpreter i przekaż całe polecenie jako jeden argument, pamiętając, że utrudnia to systemd śledzenie procesu głównego. Podobnie jest z katalogiem roboczym i zmiennymi — bez WorkingDirectory oraz Environment program może startować z innego miejsca, niż zakładasz, i nie znaleźć plików konfiguracyjnych.
Drugi typ błędów dotyczy nazewnictwa i wdrożenia. Nazwa pliku musi odpowiadać nazwie jednostki, inaczej systemctl jej nie znajdzie, a po każdej zmianie pliku trzeba wykonać daemon-reload. Nie edytuj jednostek w katalogu pakietowym, bo aktualizacja je nadpisze — trzymaj własny plik w katalogu systemowym albo użyj drop-in. Pamiętaj też, że enable nie sprawdza poprawności konfiguracji, więc najpierw uruchom usługę ręcznie i obejrzyj status oraz dziennik. W kontenerze lub środowisku bez działającego systemd żadna jednostka nie wystartuje, choćby była bezbłędna.
Najczęstsze pytania
Czym różni się Type=simple od forking?
Simple uruchamia proces na pierwszym planie. Forking jest dla usług, które same odłączają się i działają w tle (daemony).
Po co RestartSec?
Określa opóźnienie między kolejnymi próbami restartu. Chroni przed pętlą szybkich restartów zajmujących CPU.
Gdzie sprawdzić błędy?
Użyj journalctl -u nazwa -e lub systemctl status nazwa, aby zobaczyć ostatnie zdarzenia.
Czym jest generator jednostki systemd?
To narzędzie, które z danych z formularza tworzy gotowy plik .service dla systemd. Dzięki niemu nie trzeba pamiętać nazw sekcji ani kolejności dyrektyw.
Gdzie zapisać wygenerowany plik .service?
Standardowo w /etc/systemd/system/nazwa.service dla usług systemowych. Po skopiowaniu wykonaj systemctl daemon-reload, aby systemd odczytał nową jednostkę.
Jaki Type wybrać dla mojej aplikacji?
Jeśli proces działa na pierwszym planie i nie kończy się sam, wybierz simple. Jeśli aplikacja odłącza się od terminala i działa w tle, wybierz forking.
Kiedy stosować Restart=always, a kiedy on-failure?
always restartuje usługę po każdym zakończeniu, nawet poprawnym. on-failure tylko po błędzie, co jest bezpieczniejsze dla zadań jednorazowych.
Jak sprawdzić, czy wygenerowana usługa działa poprawnie?
Użyj systemctl status nazwa oraz journalctl -u nazwa -e. Pierwsze pokazuje stan jednostki, drugie ostatnie wpisy z logu.
Czy nazwa pliku musi być zgodna z nazwą usługi?
Tak. Nazwa pliku bez rozszerzenia jest nazwą jednostki, więc plik myapp.service obsługujesz poleceniami w rodzaju systemctl start myapp. Zmiana nazwy pliku bez zmiany poleceń sprawi, że systemctl nie znajdzie jednostki.
Jak uruchomić taką usługę bez uprawnień roota?
Skorzystaj z trybu użytkownika: plik umieść w katalogu konfiguracyjnym systemd dla swojego konta, ustaw WantedBy=default.target i wydawaj polecenia z opcją --user. Taka usługa działa w ramach sesji użytkownika, więc po wylogowaniu może zostać zatrzymana.
Czy można sprawdzić poprawność wygenerowanego pliku przed włączeniem usługi?
Tak, służy do tego systemd-analyze verify ze ścieżką do pliku, które wskazuje błędne dyrektywy i literówki. Generator pilnuje układu sekcji, ale nie sprawdzi, czy podane ścieżki, konta i polecenia istnieją w Twoim systemie.