Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu: Skills Rozpocznij
Sekcja
Administracja Linux Serwery Wirtualne

Jak używać systemd do uruchomienia usługi Linux przy starcie systemu

Zapewnienie, że usługi krytyczne uruchamiają się automatycznie po ponownym uruchomieniu serwera, jest jedną z najbardziej fundamentalnych odpowiedzialności każdego administratora systemów Linux. Niezależnie od tego, czy uruchamiasz aplikację internetową, silnik bazy danych czy niestandardowy demon na środowisku VPS Hosting, nieoczekiwane ponowne uruchomienie nigdy nie powinno oznaczać prolongowanego przestoju. Dzięki systemd — nowoczesnemu systemowi init zasilającemu większość dzisiejszych dystrybucji Linux — możesz precyzyjnie zdefiniować jak, kiedy i jako kto uruchamiają się Twoje usługi, wszystko poprzez czysty, deklaratywny plik jednostki.

Ten kompleksowy przewodnik przeprowadzi Cię przez każdy krok: zrozumienie czym jest systemd, tworzenie gotowego do produkcji pliku jednostki usługi, weryfikacja uprawnień, testowanie Twojego pliku wykonywalnego i zarządzanie cyklem życia usługi. Na koniec Twoja niestandardowa aplikacja będzie przetrwać każde ponowne uruchomienie automatycznie.

Co to jest systemd i dlaczego ma to znaczenie?

systemd to system init i menedżer usług, który zastąpił starsze alternatywy, takie jak SysVinit i Upstart, w większości głównych dystrybucji Linux, w tym Ubuntu, Debian, CentOS, Rocky Linux, AlmaLinux i Fedora. Zamiast wykonywać sekwencyjny łańcuch skryptów powłoki podczas uruchamiania, systemd paralelizuje uruchamianie usług, rozwiązuje porządek zależności i zarządza całym cyklem życia procesów systemowych z jednego, ujednoliconego interfejsu.

Kluczowe zalety systemd dla środowisk serwerowych

FunkcjaKorzyść
Równoległe uruchamianie usługSzybsze czasy uruchamiania na serwerach z wieloma usługami
Zarządzanie zależnościamiUsługi uruchamiają się dopiero po przygotowaniu ich wymagań wstępnych
Automatyczne zasady ponownego uruchamianiaUszkodzone usługi odzyskują się bez ręcznej interwencji
Scentralizowane rejestrowanie za pośrednictwem journaldWszystkie dane wyjściowe usługi przechwytywane w przeszukiwalnym dzienniku
Kontrola zasobów oparta na cgroupLimity CPU i pamięci wymuszane dla każdej usługi
Aktywacja gniazda i urządzeniaUsługi uruchamiają się na żądanie, a nie bezwarunkowo

Dla każdego zarządzającego aplikacjami na Dedicated Servers lub instancjach VPS, te możliwości przekładają się bezpośrednio na wyższą dostępność i bardziej przewidywalne zachowanie pod obciążeniem.

Zrozumienie plików jednostek systemd

Wszystko, czym zarządza systemd, jest reprezentowane przez plik jednostki — zwykły plik konfiguracyjny podzielony na sekcje. Plik jednostki .service mówi systemd:

  • Co to jest usługa (metadane, opis, zależności)
  • Jak ją uruchomić (ścieżka pliku wykonywalnego, katalog roboczy, kontekst użytkownika)
  • Kiedy ją uruchomić (cel rozruchu, kolejność względem innych jednostek)
  • Co zrobić, jeśli się nie powiedzie (polityka ponownego uruchomienia, opóźnienie ponownego uruchomienia)

Pliki jednostek usług dla usług całego systemu znajdują się w /etc/systemd/system/. Pliki umieszczone tutaj mają pierwszeństwo przed jednostkami dostarczonymi przez dostawcę w /lib/systemd/system/ i utrzymują się podczas aktualizacji pakietów.

Krok po kroku: Tworzenie jednostki usługi systemd

Poniższy przewodnik używa fikcyjnej aplikacji o nazwie myapp. Zastąp każde wystąpienie myapp, myuser i /usr/bin/myapp wartościami odpowiednimi dla Twojego środowiska.

Krok 1: Przygotowanie katalogu roboczego

Przed napisaniem pliku jednostki zdecyduj, z którego katalogu będzie działać Twoja aplikacja. Dedykowany katalog roboczy utrzymuje pliki konfiguracyjne, dzienniki i dane czasu wykonywania w porządku i ułatwia zarządzanie uprawnieniami.

Utwórz katalog, jeśli jeszcze nie istnieje:

sudo mkdir -p /opt/myapp

> Dlaczego /opt/ zamiast /etc/systemd/?

> Drzewo /etc/systemd/ jest zarezerwowane dla własnej konfiguracji systemd. Umieszczanie tam danych aplikacji jest niestandardowe i może powodować zamieszanie. Użyj /opt/myapp, /srv/myapp lub /var/lib/myapp w zależności od kategorii Filesystem Hierarchy Standard, która najlepiej pasuje do Twojego obciążenia.

Przypisz własność użytkownikowi, który będzie uruchamiać usługę:

sudo useradd --system --no-create-home --shell /usr/sbin/nologin myuser
sudo chown -R myuser:myuser /opt/myapp

Używanie dedykowanego konta systemowego (bez powłoki logowania, bez katalogu domowego) jest najlepszą praktyką bezpieczeństwa. Ogranicza to zasięg szkód, jeśli aplikacja kiedykolwiek zostanie zagrożona.

Zweryfikuj wynik:

ls -ld /opt/myapp
# Expected output: drwxr-xr-x 2 myuser myuser 4096 Jan 1 00:00 /opt/myapp

Krok 2: Tworzenie pliku jednostki usługi

Otwórz nowy plik jednostki za pomocą preferowanego edytora:

sudo nano /etc/systemd/system/myapp.service

Wklej poniższą zawartość, dostosowując wartości do Twojej aplikacji:

[Unit]
Description=My Custom Application
Documentation=https://example.com/docs
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/myapp --config /opt/myapp/myapp.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5s
User=myuser
Group=myuser
WorkingDirectory=/opt/myapp
StandardOutput=journal
StandardError=journal
SyslogIdentifier=myapp

# Security hardening
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Zapisz plik za pomocą Ctrl+O, a następnie wyjdź za pomocą Ctrl+X.

Krok 3: Zrozumienie każdej dyrektywy

[Unit] Sekcja

DyrektywaCel
DescriptionCzytelna dla człowieka nazwa wyświetlana w danych wyjściowych systemctl status
DocumentationOdnośnik URL lub strona podręcznika dla usługi
AfterZapewnia, że usługa uruchamia się *po* aktywacji wymienionej jednostki
WantsMiękka zależność — systemd *spróbuje* uruchomić wymienioną jednostkę, ale nie będzie działać, jeśli jest niedostępna

> network-online.target vs network.target: Użyj network-online.target (w połączeniu z Wants=network-online.target) dla usług, które naprawdę potrzebują w pełni skonfigurowanego interfejsu sieciowego — na przykład aplikacji, która łączy się ze zdalną bazą danych lub zewnętrznym API podczas uruchamiania. network.target gwarantuje tylko, że podsystem sieciowy został *uruchomiony*, a nie że interfejsy są aktywne i adresy są przypisane.

[Service] Sekcja

DyrektywaCel
Type=simpleProces uruchomiony przez ExecStart jest procesem głównym (domyślnie dla większości aplikacji)
ExecStartPełna ścieżka do pliku binarnego i wszelkich argumentów. Zawsze używaj ścieżek bezwzględnych.
ExecReloadPolecenie przeładowania konfiguracji bez pełnego ponownego uruchomienia (opcjonalne, ale zalecane)
Restart=on-failureUruchom ponownie usługę tylko wtedy, gdy wyjdzie z kodem niezerowym lub zostanie zabita przez sygnał. Użyj always, jeśli chcesz ponownych uruchomień nawet przy czystych wyjściach.
RestartSecSekundy oczekiwania przed próbą ponownego uruchomienia
User / GroupUruchom proces jako ten użytkownik/grupa zamiast root
WorkingDirectoryUstaw bieżący katalog przed wykonaniem ExecStart
StandardOutput / StandardErrorKieruj stdout/stderr do dziennika systemd
SyslogIdentifierTag używany do filtrowania wpisów dziennika dla tej usługi
NoNewPrivilegesUniemożliwia procesowi uzyskanie dodatkowych uprawnień za pośrednictwem plików binarnych setuid
ProtectSystem=strictMontuje /usr, /boot i /etc jako tylko do odczytu dla usługi
ProtectHomeCzyni /home, /root i /run/user niedostępnymi
PrivateTmpDaje usłudze własną prywatną przestrzeń nazw /tmp

[Install] Sekcja

DyrektywaCel
WantedBy=multi-user.targetWłącza usługę, gdy system osiąga standardowy poziom wieloużytkownika (bez grafiki). To jest prawidłowy cel dla praktycznie wszystkich demonów serwerowych.

Krok 4: Weryfikacja uprawnień pliku i katalogu

Przed przeładowaniem systemd potwierdź, że użytkownik usługi może faktycznie uzyskać dostęp do wszystkiego, czego potrzebuje:

# Check working directory ownership and permissions
ls -ld /opt/myapp

# Confirm the executable exists and is executable
ls -l /usr/bin/myapp

# Verify the config file is readable by myuser
sudo -u myuser cat /opt/myapp/myapp.conf

Jeśli którekolwiek z tych sprawdzeń się nie powiedzie, popraw uprawnienia przed kontynuowaniem:

# Make the binary executable
sudo chmod +x /usr/bin/myapp

# Grant read access to the config file
sudo chmod 640 /opt/myapp/myapp.conf
sudo chown myuser:myuser /opt/myapp/myapp.conf

Krok 5: Ręczne testowanie pliku wykonywalnego

Zawsze sprawdzaj, czy Twoja aplikacja działa prawidłowo *przed* przekazaniem kontroli systemd. To izoluje błędy aplikacji od problemów z konfiguracją systemd:

sudo -u myuser /usr/bin/myapp --config /opt/myapp/myapp.conf

Jeśli aplikacja uruchamia się bez błędów, naciśnij Ctrl+C aby ją zatrzymać i kontynuuj. Jeśli się nie powiedzie, rozwiąż problemy samej aplikacji — sprawdź, czy wszystkie zależności są zainstalowane, zmienne środowiskowe są ustawione i wymagane porty są dostępne.

Krok 6: Przeładowanie systemd i włączenie usługi

Po zapisaniu pliku jednostki poinstruuj systemd, aby ponownie przeczytał swoją konfigurację:

sudo systemctl daemon-reload

Włącz usługę, aby uruchamiała się automatycznie przy każdym kolejnym uruchomieniu:

sudo systemctl enable myapp.service

To polecenie tworzy dowiązanie symboliczne w odpowiednim katalogu .wants, łącząc plik jednostki w sekwencję uruchamiania multi-user.target. Powinieneś zobaczyć dane wyjściowe podobne do:

Created symlink /etc/systemd/system/multi-user.target.wants/myapp.service → /etc/systemd/system/myapp.service.

Uruchom usługę natychmiast bez ponownego uruchamiania:

sudo systemctl start myapp.service

Krok 7: Weryfikacja, czy usługa jest uruchomiona

Sprawdź bieżący stan usługi:

sudo systemctl status myapp.service

Zdrowa usługa daje dane wyjściowe takie jak to:

● myapp.service - My Custom Application
     Loaded: loaded (/etc/systemd/system/myapp.service; enabled; vendor preset: disabled)
     Active: active (running) since Wed 2025-01-01 12:00:00 UTC; 5s ago
   Main PID: 12345 (myapp)
      Tasks: 4 (limit: 4915)
     Memory: 12.3M
        CPU: 45ms
     CGroup: /system.slice/myapp.service
             └─12345 /usr/bin/myapp --config /opt/myapp/myapp.conf

Kluczowe pola do weryfikacji:

  • Loaded — potwierdza, że plik jednostki został pomyślnie przeanalizowany i pokazuje, czy jest enabled lub disabled dla uruchamiania
  • Active: active (running) — usługa jest aktualnie uruchomiona
  • Main PID — identyfikator procesu Twojej aplikacji

Krok 8: Monitorowanie dzienników za pomocą journalctl

systemd kieruje wszystkie dane wyjściowe usługi do dziennika, strukturalnego, przeszukiwanego magazynu dzienników. Użyj journalctl aby go sprawdzić:

# View all logs for myapp (most recent last)
journalctl -u myapp.service

# Follow live log output (like tail -f)
journalctl -u myapp.service -f

# Show only logs since the last boot
journalctl -u myapp.service -b

# Show the last 50 lines
journalctl -u myapp.service -n 50

# Show logs since a specific time
journalctl -u myapp.service --since "2025-01-01 12:00:00"

Jeśli Twoja usługa nie uruchamia się, dziennik prawie zawsze zawiera dokładny komunikat błędu wyjaśniający dlaczego. To jest pierwsze miejsce, w którym należy szukać przed wprowadzeniem jakichkolwiek zmian.

Krok 9: Testowanie zachowania podczas uruchamiania

Aby potwierdzić, że usługa przetrwa ponowne uruchomienie bez ręcznego sprawdzania sekwencji uruchamiania, możesz to symulować:

# Reboot the server (only if safe to do so)
sudo reboot

Po powrocie serwera do trybu online sprawdź ponownie stan usługi:

sudo systemctl status myapp.service

Jeśli pokazuje active (running), Twoja usługa jest prawidłowo skonfigurowana do automatycznego uruchamiania.

Zarządzanie cyklem życia usługi

Po uruchomieniu usługi będziesz regularnie używać następujących poleceń:

Typowe polecenia systemctl

# Start the service
sudo systemctl start myapp.service

# Stop the service gracefully
sudo systemctl stop myapp.service

# Restart the service (stop + start)
sudo systemctl restart myapp.service

# Reload configuration without restarting (if ExecReload is defined)
sudo systemctl reload myapp.service

# Enable automatic startup at boot
sudo systemctl enable myapp.service

# Disable automatic startup at boot
sudo systemctl disable myapp.service

# Check whether the service is enabled
sudo systemctl is-enabled myapp.service

# Check whether the service is currently active
sudo systemctl is-active myapp.service

# View the full unit file as systemd interprets it
sudo systemctl cat myapp.service

# Edit the unit file and reload in one step
sudo systemctl edit --full myapp.service

Rozwiązywanie typowych problemów

Usługa nie uruchamia się: “No such file or directory”

Zwykle oznacza to, że ExecStart wskazuje na nieistniejący plik binarny lub WorkingDirectory nie istnieje. Sprawdź obie ścieżki:

which myapp
ls -l /opt/myapp

Usługa uruchamia się, ale natychmiast się zamyka

Sprawdź dziennik w poszukiwaniu własnych komunikatów o błędach aplikacji:

journalctl -u myapp.service -n 100 --no-pager

Sprawdź również, czy Type=simple jest poprawny dla Twojej aplikacji. Jeśli Twój plik binarny rozwidla się w tle, użyj zamiast tego Type=forking.

Błędy “Permission denied”

Użytkownik usługi nie ma dostępu do wymaganego pliku lub katalogu. Użyj ls -l do audytu uprawnień i sudo -u myuser do interaktywnego testowania dostępu.

Port już w użyciu

Inny proces jest powiązany z portem, którego potrzebuje Twoja aplikacja. Zidentyfikuj go za pomocą:

sudo ss -tlnp | grep :<port>

Usługa restartuje się w pętli

Jeśli Restart=on-failure powoduje szybkie pętle restartowania, systemd ostatecznie ograniczy restartowanie. Sprawdź StartLimitIntervalSec i StartLimitBurst w sekcji [Unit], aby dostroić to zachowanie, i zawsze zbadaj pierwotną przyczynę w dzienniku.

Zaawansowane wzorce systemd dla serwerów produkcyjnych

Zmienne środowiskowe i pliki środowiska

Nigdy nie koduj na stałe sekretów w plikach jednostek. Zamiast tego użyj pliku środowiska:

[Service]
EnvironmentFile=/etc/myapp/myapp.env
ExecStart=/usr/bin/myapp

Utwórz /etc/myapp/myapp.env z chmod 600 i chown root:myuser aby ograniczyć dostęp:

DATABASE_URL=postgresql://user:password@localhost/mydb
API_KEY=supersecretkey

Zależności usług i porządkowanie

Jeśli Twoja aplikacja zależy od usługi bazy danych (np. PostgreSQL lub MySQL), zadeklaruj tę zależność jawnie:

[Unit]
After=network-online.target postgresql.service
Requires=postgresql.service

Requires jest twardą zależnością — jeśli PostgreSQL nie uruchomi się, systemd nie będzie próbować uruchomić Twojej usługi.

Integracja Watchdog

W przypadku usług krytycznych dla misji włącz wbudowany watchdog systemd do wykrywania zawieszonych procesów:

[Service]
WatchdogSec=30s
Restart=on-watchdog

Twoja aplikacja musi okresowo wywoływać sd_notify(0, "WATCHDOG=1") aby zresetować timer watchdog. Jeśli tego nie zrobi w ciągu WatchdogSec, systemd zabija i restartuje usługę.

Wybór odpowiedniego środowiska hostingowego

Wzorce konfiguracji systemd opisane w tym przewodniku mają zastosowanie równo na wszystkich typach serwerów Linux, ale wybór infrastruktury hostingowej wpływa na to, jak dużą kontrolę masz nad systemem init i zarządzaniem usługami.

  • Hosting VPS — Pełny dostęp root, pełna kontrola systemd, idealny do niestandardowych wdrożeń aplikacji. Plany VPS AlexHost działają na wirtualizacji KVM, dając ci prawdziwe izolowane środowisko jądra.
  • Serwery dedykowane — Maksymalna wydajność i izolacja dla usług wymagających dużych zasobów. Pełny dostęp do sprzętu bez hałaśliwych sąsiadów.
  • VPS z cPanel — Łączy dostęp na poziomie root do systemd z graficznym panelem sterowania dla zespołów, które zarządzają zarówno usługami systemowymi, jak i hostingiem internetowym z jednego interfejsu.
  • Hosting współdzielony — Odpowiedni dla standardowych aplikacji internetowych, które nie wymagają niestandardowych usług systemowych. Brak dostępu root, ale zero obciążenia zarządzaniem serwerem.

Jeśli wdrażasz niestandardowy demon, mikrousługę lub jakąkolwiek aplikację, która musi automatycznie przetrwać ponowne uruchomienie, odpowiednim wyborem jest VPS lub serwer dedykowany z pełnym dostępem root.

Szybki Przewodnik: Kompletna Lista Kontrolna Usługi systemd

Przed uznaniem usługi za gotową do produkcji, zweryfikuj każdy element na tej liście:

  • [ ] Plik Unit zapisany w /etc/systemd/system/myapp.service
  • [ ] ExecStart używa ścieżki bezwzględnej do prawidłowego, wykonywalnego pliku binarnego
  • [ ] WorkingDirectory istnieje i jest własnością użytkownika usługi
  • [ ] Usługa działa na dedykowanym koncie systemowym innym niż root
  • [ ] sudo systemctl daemon-reload wykonany po każdej zmianie pliku Unit
  • [ ] sudo systemctl enable myapp.service potwierdza utworzenie dowiązania symbolicznego
  • [ ] sudo systemctl status myapp.service pokazuje active (running)
  • [ ] journalctl -u myapp.service nie wykazuje błędów
  • [ ] Serwer uruchomiony ponownie i usługa potwierdzona jako uruchomiona po rozruchu
  • [ ] Dyrektywy wzmacniania bezpieczeństwa (NoNewPrivileges, ProtectSystem, PrivateTmp) zastosowane

Podsumowanie

systemd jest ostateczną warstwą zarządzania usługami dla nowoczesnych serwerów Linux. Tworząc dobrze ustrukturyzowany plik jednostki .service, zyskujesz automatyczne uruchamianie przy starcie, inteligentne zasady ponownego uruchamiania, scentralizowane logowanie i szczegółową kontrolę bezpieczeństwa — wszystko bez napisania jednej linii skryptu powłoki.

Proces jest prosty: przygotuj dedykowany katalog roboczy i użytkownika systemu, napisz plik jednostki z prawidłowymi sekcjami [Unit], [Service] i [Install], przeładuj demona systemd, włącz i uruchom usługę, a następnie sprawdź za pomocą systemctl status i journalctl. Zastosuj dyrektywy wzmacniania bezpieczeństwa omówione powyżej, a Twoja usługa będzie zarówno odporna, jak i odpowiednio odizolowana od reszty systemu.

Niezależnie od tego, czy wdrażasz Node.js API, pracownika Python, binarny Go czy jakąkolwiek inną niestandardową aplikację na planie VPS Hosting lub Dedicated Servers AlexHost, ten przepływ pracy systemd zapewnia, że Twoja usługa zawsze działa, gdy potrzebują jej Twoi użytkownicy — nawet po nieoczekiwanym ponownym uruchomieniu.