Save 15% on All Hosting Services

Testează-ți abilitățile și obține Reducere la orice plan de găzduire

Utilizați codul: Skills Începeți
Secțiuni
Administrație Linux Servere virtuale

Cum să utilizezi systemd pentru a porni un serviciu Linux la boot

Asigurarea că serviciile critice se pornesc automat atunci când serverul dvs. se repornește este una dintre cele mai fundamentale responsabilități ale oricărui administrator de sisteme Linux. Indiferent dacă rulați o aplicație web, un motor de bază de date sau un daemon personalizat pe un mediu VPS Hosting, o repornire neașteptată nu ar trebui să însemne niciodată o întrerupere prelungită. Cu systemd — sistemul init modern care alimentează majoritatea distribuțiilor Linux de astazi — puteți defini cu precizie cum, când și ca cine se lansează serviciile dvs., toate prin intermediul unui fișier de unitate curat și declarativ.

Acest ghid cuprinzător vă ghidează prin fiecare pas: înțelegerea ce este systemd, crearea unui fișier de unitate de serviciu gata pentru producție, verificarea permisiunilor, testarea executabilului și gestionarea ciclului de viață al serviciului. La final, aplicația dvs. personalizată va supraviețui fiecărei reporniri automat.

Ce este systemd și de ce conteaza?

systemd este un sistem init și manager de servicii care a înlocuit alternative mai vechi, cum ar fi SysVinit și Upstart, în majoritatea distribuțiilor Linux majore, inclusiv Ubuntu, Debian, CentOS, Rocky Linux, AlmaLinux și Fedora. În loc să execute o succesiune secvențială de scripturi shell la pornire, systemd paralelizează pornirea serviciilor, rezolvă ordinea dependențelor și gestionează întregul ciclu de viață al proceselor de sistem dintr-o singură interfață unificată.

Avantajele cheie ale systemd pentru mediile de server

CaracteristicăBeneficiu
Pornirea paralelă a serviciilorTimpi de pornire mai rapizi pe servere cu mai multe servicii
Gestionarea dependențelorServiciile se pornesc doar după ce condițiile prealabile sunt gata
Politici de repornire automatăServiciile defecte se recuperează fără intervenție manuală
Jurnalizare centralizată prin journaldToată ieșirea serviciului este capturată într-un jurnal interogabil
Control al resurselor bazat pe cgroupLimitele de CPU și memorie sunt aplicate per serviciu
Activare socket și dispozitivServiciile se pornesc la cerere, nu necondiționat

Pentru oricine gestionează aplicații pe Servere Dedicate sau instanțe VPS, aceste capabilități se traduc direct în timp de funcționare mai mare și comportament mai previzibil sub sarcină.

Înțelegerea fișierelor de unitate systemd

Totul ce gestionează systemd este reprezentat de un fișier de unitate — un fișier de configurare în text simplu împărțit în secțiuni. Un fișier de unitate de serviciu spune systemd:

  • Ce este serviciul (metadate, descriere, dependențe)
  • Cum să-l ruleze (cale executabilă, director de lucru, context utilizator)
  • Când să-l pornească (țintă de pornire, ordonare relativă la alte unități)
  • Ce să facă dacă eșuează (politică de repornire, întârziere de repornire)

Fișierele de unitate de serviciu pentru serviciile la nivel de sistem se află în /etc/systemd/system/. Fișierele plasate aici au prioritate asupra unităților furnizate de furnizor în /lib/systemd/system/ și persistă în toate actualizările de pachete.

Pas cu pas: Crearea unei unități de serviciu systemd

Următoarea procedură folosește o aplicație fictivă numită myapp. Înlocuiți fiecare instanță de myapp, myuser și /usr/bin/myapp cu valori potrivite pentru propriul dvs. mediu.

Pasul 1: Pregătiți directorul de lucru

Înainte de a scrie fișierul de unitate, decideți de unde va rula aplicația dvs. Un director de lucru dedicat ține fișierele de configurare, jurnalele și datele de runtime organizate și face gestionarea permisiunilor simplă.

Creați directorul dacă nu există deja:

sudo mkdir -p /opt/myapp

> De ce /opt/ în loc de /etc/systemd/?

> Arborele /etc/systemd/ este rezervat pentru propria configurație a systemd. Plasarea datelor aplicației acolo nu este standard și poate cauza confuzie. Utilizați /opt/myapp, /srv/myapp sau /var/lib/myapp în funcție de categoria Standardului Ierarhiei Sistemului de fișiere care se potrivește cel mai bine sarcinii dvs.

Atribuiți proprietatea utilizatorului care va rula serviciul:

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

Utilizarea unui cont de sistem dedicat (fără shell de conectare, fără director acasă) este o bună practică de securitate. Limitează raza de acțiune dacă aplicația este vreodată compromisă.

Verificați rezultatul:

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

Pasul 2: Creați fișierul de unitate de serviciu

Deschideți un nou fișier de unitate cu editorul preferat:

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

Lipiți următorul conținut, ajustând valorile pentru a se potrivi aplicației dvs.:

[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

Salvați fișierul cu Ctrl+O, apoi ieșiți cu Ctrl+X.

Pasul 3: Înțelegerea fiecărei directive

Secțiunea [Unit]

DirectivăScop
DescriptionNume ușor de citit afișat în ieșirea systemctl status
DocumentationReferință URL sau pagină man pentru serviciu
AfterAsigură că serviciul se pornește *după* ce unitatea listată este activă
WantsDependență slabă — systemd va *încerca* să pornească unitatea listată, dar nu va eșua dacă nu este disponibilă

> network-online.target vs network.target: Utilizați network-online.target (combinat cu Wants=network-online.target) pentru serviciile care au cu adevărat nevoie de o interfață de rețea complet configurată — de exemplu, o aplicație care se conectează la o bază de date la distanță sau la un API extern la pornire. network.target garantează doar că subsistemul de rețea a fost *pornit*, nu că interfețele sunt active și adresele sunt atribuite.

Secțiunea [Service]

DirectivăScop
Type=simpleProcesul pornit de ExecStart este procesul principal (implicit pentru majoritatea aplicațiilor)
ExecStartCale completă la binar și orice argumente. Utilizați întotdeauna căi absolute.
ExecReloadComandă pentru a reîncărca configurația fără o repornire completă (opțional, dar recomandat)
Restart=on-failureReporniți serviciul doar atunci când se închide cu un cod diferit de zero sau este ucis de un semnal. Utilizați always dacă doriți reporniri chiar și la ieșiri curate.
RestartSecSecunde de așteptare înainte de a încerca o repornire
User / GroupRulați procesul ca acest utilizator/grup în loc de root
WorkingDirectorySetați directorul curent înainte de a executa ExecStart
StandardOutput / StandardErrorRutați stdout/stderr către jurnalul systemd
SyslogIdentifierEtichetă folosită pentru a filtra intrările jurnalului pentru acest serviciu
NoNewPrivilegesPrevine procesul să obțină privilegii suplimentare prin binare setuid
ProtectSystem=strictMontează /usr, /boot și /etc ca doar pentru citire pentru serviciu
ProtectHomeFace /home, /root și /run/user inaccesibile
PrivateTmpDă serviciului propriul spațiu de nume /tmp

Secțiunea [Install]

DirectivăScop
WantedBy=multi-user.targetActivează serviciul atunci când sistemul atinge nivelul standard multi-utilizator (non-grafic). Aceasta este ținta corectă pentru practic toate demonii de server.

Pasul 4: Verificați permisiunile fișierului și directorului

Înainte de a reîncărca systemd, confirmați că utilizatorul serviciului poate accesa cu adevărat tot ce are nevoie:

# 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

Dacă oricare dintre aceste verificări eșuează, corectați permisiunile înainte de a continua:

# 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

Pasul 5: Testați executabilul manual

Verificați întotdeauna că aplicația dvs. se execută corect *înainte* de a transfera controlul la systemd. Aceasta izolează erorile aplicației de problemele de configurare systemd:

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

Dacă aplicația se pornește fără erori, apăsați Ctrl+C pentru a o opri și continuați. Dacă eșuează, depanați aplicația în sine — verificați că toate dependențele sunt instalate, variabilele de mediu sunt setate și porturile necesare sunt disponibile.

Pasul 6: Reîncărcați systemd și activați serviciul

După salvarea fișierului de unitate, instruiți systemd să-și relisească configurația:

sudo systemctl daemon-reload

Activați serviciul pentru a se porni automat la fiecare repornire ulterioară:

sudo systemctl enable myapp.service

Această comandă creează o legătură simbolică în directorul .wants corespunzător, legând fișierul dvs. de unitate în secvența de pornire multi-user.target. Ar trebui să vedeți o ieșire similară cu:

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

Porniți serviciul imediat fără a reporni:

sudo systemctl start myapp.service

Pasul 7: Verificați că serviciul rulează

Verificați starea actuală a serviciului:

sudo systemctl status myapp.service

Un serviciu sănătos produce o ieșire ca aceasta:

● 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

Câmpuri cheie de verificat:

  • Loaded — confirmă că fișierul de unitate a fost analizat cu succes și arată dacă este enabled sau disabled pentru pornire
  • Active: active (running) — serviciul rulează în prezent
  • Main PID — ID-ul procesului aplicației dvs.

Pasul 8: Monitorizați jurnalele cu journalctl

systemd rutează toată ieșirea serviciului către jurnal, un magazin de jurnal structurat și interogabil. Utilizați journalctl pentru a-l inspecta:

# 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"

Dacă serviciul dvs. nu se pornește, jurnalul conține aproape întotdeauna mesajul de eroare exact care explică de ce. Aceasta este primul loc unde trebuie să căutați înainte de a face orice modificări.

Pasul 9: Testați comportamentul la pornire

Pentru a confirma că serviciul supraviețuiește unei reporniri fără a inspecta manual secvența de pornire, puteți simula-o:

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

După ce serverul se conectează din nou, verificați din nou starea serviciului:

sudo systemctl status myapp.service

Dacă arată active (running), serviciul dvs. este configurat corect pentru pornire automată.

Gestionarea ciclului de viață al serviciului

Odată ce serviciul dvs. rulează, veți folosi următoarele comenzi în mod regulat:

Comenzi systemctl frecvente

# 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

Depanarea problemelor frecvente

Serviciul nu se pornește: “Nu există un astfel de fișier sau director”

Aceasta de obicei înseamnă că ExecStart indică un binar inexistent sau WorkingDirectory nu există. Verificați ambele căi:

which myapp
ls -l /opt/myapp

Serviciul se pornește dar se închide imediat

Verificați jurnalul pentru ieșirea de eroare proprie a aplicației:

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

De asemenea, verificați că Type=simple este corect pentru aplicația dvs. Dacă binarul dvs. se bifurcă în fundal, utilizați Type=forking în schimb.

Erori “Permisiune refuzată”

Utilizatorul serviciului nu are acces la un fișier sau director necesar. Utilizați ls -l pentru a audita permisiunile și sudo -u myuser pentru a testa accesul interactiv.

Port deja în uz

Un alt proces este legat la portul de care are nevoie aplicația dvs. Identificați-l cu:

sudo ss -tlnp | grep :<port>

Serviciul se repornește într-o buclă

Dacă Restart=on-failure provoacă bucle de repornire rapidă, systemd va accelera în cele din urmă reporninile. Verificați StartLimitIntervalSec și StartLimitBurst în secțiunea [Unit] pentru a regla acest comportament și investigați întotdeauna cauza rădăcinii în jurnal.

Modele systemd avansate pentru servere de producție

Variabile de mediu și fișiere de mediu

Nu codificați niciodată secretele în fișierele de unitate. Utilizați în schimb un fișier de mediu:

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

Creați /etc/myapp/myapp.env cu chmod 600 și chown root:myuser pentru a restricționa accesul:

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

Dependențe de serviciu și ordonare

Dacă aplicația dvs. depinde de un serviciu de bază de date (de exemplu, PostgreSQL sau MySQL), declarați acea dependență în mod explicit:

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

Requires este o dependență dură — dacă PostgreSQL nu se pornește, systemd nu va încerca nici să pornească serviciul dvs.

Integrare watchdog

Pentru serviciile critice, activați watchdog-ul încorporat al systemd pentru a detecta procesele blocate:

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

Aplicația dvs. trebuie să apeleze sd_notify(0, "WATCHDOG=1") periodic pentru a reseta cronometrul watchdog. Dacă nu reușește să facă acest lucru în WatchdogSec, systemd ucide și repornește serviciul.

Alegerea mediului de găzduire potrivit

Modelele de configurare systemd descrise în acest ghid se aplică în mod egal în toate tipurile de servere Linux, dar alegerea infrastructurii dvs. de găzduire afectează cât de mult control aveți asupra sistemului init și gestionării serviciilor.

  • VPS Hosting — Acces root complet, control systemd complet, ideal pentru implementări de aplicații personalizate. Planurile VPS AlexHost rulează pe virtualizare KVM, oferindu-vă un mediu cu kernel izolat autentic.
  • Servere Dedicate — Performanță și izolare maxime pentru serviciile care consumă resurse. Acces hardware complet fără vecini zgomotoși.
  • VPS cu cPanel
Linux Servere virtuale
Administrație Linux
Linux Securitate

Save 15% on All Hosting Services

Testează-ți abilitățile și obține Reducere la orice plan de găzduire

Utilizați codul: Skills Începeți
Acces rapid la informații
Acces rapid la informații

Economisiți timp și obțineți un răspuns rapid la întrebarea dvs

Rezolvați singur problemele
Rezolvați singur problemele

Baza de cunoștințe conține tutoriale detaliate, care vă permit să vă ocupați singur de sarcinile tehnice.

Îmbunătățirea competențelor
Îmbunătățirea competențelor

Prin utilizarea bazei de cunoștințe, vă extindeți cunoștințele despre găzduirea web și subiecte conexe

Ilustrații și diagrame
Ilustrații și diagrame

Multe articole sunt însoțite de ilustrații și diagrame, facilitând înțelegerea proceselor și setărilor complexe.

Trucuri utile
Trucuri utile

Veți găsi sfaturi utile pentru a îmbunătăți performanța site-ului sau aplicației dvs.

Relevanța subiectelor date
Relevanța subiectelor date

Informațiile din baza de cunoștințe sunt actualizate periodic pentru a reflecta cele mai recente schimbări și tendințe în domeniul infrastructurii IT și al serviciilor AlexHost

Nu ați găsit subiectul pe care îl căutați? Există o soluție perfectă

Oaspeți și clienți de excepție! Confortul dumneavoastră este prioritatea noastră! Dacă întâmpinați dificultăți în instalarea unui anumit software sau în implementarea unui server, vă rugăm să nu ezitați să ne contactați. Apreciem opinia dvs. și suntem întotdeauna gata să vă ajutăm să vă rezolvați problemele.

În plus, vă oferim posibilitatea de a participa activ la crearea bazei noastre de cunoștințe. Dacă aveți subiecte sau întrebări pe care ați dori să le includeți în baza noastră de date, anunțați-ne! Suntem pregătiți să scriem articole și ghiduri detaliate pe baza nevoilor dvs.

Ne străduim să vă facem experiența cu AlexHost cât mai convenabilă și eficientă posibil, iar contribuția dvs. la baza de cunoștințe ne ajută să atingem acest obiectiv. Contactați-ne ->
info@alexhost.com și spuneți-ne cum putem face șederea dvs. la noi și mai bună.

Solution Image