systemctl — upravljanje servisima

Kad na Linux serveru nešto radi u pozadini — veb server, baza, SSH, zakazani poslovi — time upravlja systemd. A systemctl je komanda kojom ti upravljaš njime.

Ovo je verovatno komanda koju ćeš kao administrator kucati najviše puta u životu.

Oblik komande

systemctl [radnja] [jedinica]
  • radnjastart, stop, status, enable
  • jedinica — ime servisa, npr. httpd ili httpd.service

Nastavak .service se podrazumeva, pa ga ne moraš pisati.

Sve radnje koje menjaju stanje sistema traže administratorska prava, pa idu uz sudo. Provere ne traže.

Šta je jedinica

systemd ne upravlja samo servisima. Sve čime barata zove se jedinica (unit), a servis je samo najčešći tip:

TipŠta je
.serviceservis — program koji radi u pozadini
.socketsoket koji pokreće servis kad stigne veza
.timerzakazano izvršavanje, alternativa za cron
.mountmontiranje fajl sistema
.targetgrupa jedinica; naslednik runlevel-a

Pet komandi koje pokrivaju devedeset posto posla

# systemctl start httpd        pokreni sada
# systemctl stop httpd         zaustavi sada
# systemctl restart httpd      zaustavi pa pokreni
# systemctl enable httpd       pokreći se pri butovanju
# systemctl status httpd       šta se dešava

start i enable nisu isto

Ovo je najčešća greška početnika i vredi je razumeti odmah.

KomandaEfekat
startpokreće servis sada, ali posle restarta sistema ga nema
enableuključuje ga pri butovanju, ali ga sada ne pokreće

Skoro uvek hoćeš oboje. Zato postoji skraćenica:

# systemctl enable --now httpd
# systemctl disable --now httpd

Klasičan scenario: instaliraš servis, pokreneš ga sa start, sve radi. Server se restartuje za mesec dana — servisa nema, jer enable nikad nije urađen.

restart i reload

# systemctl restart httpd      potpuni restart, veze se prekidaju
# systemctl reload httpd       ponovo čita konfiguraciju, bez prekida

Kad si samo izmenio konfiguraciju, reload je bolji — sajt ne pada ni na sekundu. Ne podržavaju ga svi servisi. Ako nisi siguran:

# systemctl reload-or-restart httpd

status — glavna dijagnostika

$ systemctl status httpd
● httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
     Active: active (running) since Fri 2026-08-21 09:14:02 CEST; 5h ago
       Docs: man:httpd.service(8)
   Main PID: 1382 (httpd)
      Tasks: 213 (limit: 23012)
     Memory: 38.2M
        CPU: 4.108s
     CGroup: /system.slice/httpd.service
             ├─1382 /usr/sbin/httpd -DFOREGROUND
             └─1383 /usr/sbin/httpd -DFOREGROUND

Aug 21 09:14:02 web01 systemd[1]: Starting The Apache HTTP Server...
Aug 21 09:14:02 web01 systemd[1]: Started The Apache HTTP Server.

Tri reda nose skoro sve:

  • Loaded — gde je unit fajl i da li je enabled (radiće posle restarta) ili disabled
  • Active — trenutno stanje i koliko dugo traje
  • poslednji redovi — izvod iz loga; kad servis ne startuje, odgovor je obično tu

Moguća stanja:

StanjeZnačenje
active (running)radi
active (exited)odradio posao i završio — normalno za jednokratne jedinice
inactive (dead)zaustavljen
failedpokušao i pao
activatingu toku pokretanja

Napomena: status otvara ispis u less-u, pa se izlazi sa q. Ako ti to smeta u skripti, dodaj --no-pager.

Provera bez ispisa

Za skripte, kad te zanima samo da ili ne:

$ systemctl is-active httpd
active

$ systemctl is-enabled httpd
enabled

$ systemctl is-failed httpd
inactive

Sa --quiet ne ispisuje ništa, samo vraća izlazni kod:

if systemctl is-active --quiet httpd; then
    echo "Apache radi"
fi

Ovaj obrazac je osnova svake skripte za nadzor — više u trećem delu bash serije.

Pregled svega na sistemu

$ systemctl                              sve učitane jedinice
$ systemctl list-units --type=service     samo servisi
$ systemctl list-units --state=running    samo oni koji rade
$ systemctl --failed                      samo oni koji su pali

systemctl --failed je prva komanda kad se prijaviš na server koji se čudno ponaša. Za tri sekunde vidiš šta nije startovalo.

Šta je sve podešeno da se pokrene pri butovanju:

$ systemctl list-unit-files --state=enabled

Vredi povremeno pogledati — na serverima se nakupe servisi koje niko ne koristi, a otvaraju portove.

Unit fajlovi

Svaka jedinica je opisana tekstualnim fajlom:

$ systemctl cat httpd
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=notify
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
Restart=on-failure

[Install]
WantedBy=multi-user.target
DirektivaŠta radi
After=šta mora biti spremno pre pokretanja
ExecStart=komanda koja se izvršava
Restart=da li se sam podiže posle pada
WantedBy=u kom targetu se aktivira

Dva mesta, i to je bitno

/usr/lib/systemd/system/     fajlovi iz paketa — ne diraj
/etc/systemd/system/         tvoje izmene — ovde radiš

Ako izmeniš fajl iz prvog direktorijuma, nadogradnja paketa će ga prepisati i tvoja izmena nestaje. Zato se izmene rade ovako:

# systemctl edit httpd

Otvara prazan fajl u koji upisuješ samo ono što menjaš. Nastaje /etc/systemd/system/httpd.service.d/override.conf, koji dopunjuje original i preživljava nadogradnju.

Posle svake izmene unit fajla:

# systemctl daemon-reload

Bez toga systemd i dalje radi po starom, a ti se pitaš zašto izmena nema efekta. Ovo se zaboravlja stalno.

Maskiranje

# systemctl mask httpd
# systemctl unmask httpd

disable sprečava pokretanje pri butovanju, ali servis i dalje može da pokrene neko ručno ili druga jedinica kao zavisnost. mask ga potpuno onemogućava — pravi link na /dev/null, pa se ne može pokrenuti nikako.

Koristi se kad servis mora da ostane ugašen, recimo kad si ga zamenio drugim.

Targets

Target je grupa jedinica i naslednik nekadašnjih runlevel-a:

TargetNekadašnji runlevelŠta je
multi-user.target3pun sistem, bez grafike
graphical.target5sa grafičkim okruženjem
rescue.target1jednokorisnički režim
emergency.targetminimalni, za oporavak
$ systemctl get-default
multi-user.target

# systemctl set-default multi-user.target
# systemctl isolate rescue.target

Na serveru podrazumevani target treba da bude multi-user — grafičko okruženje samo troši resurse.

Gašenje i restart sistema

# systemctl reboot
# systemctl poweroff
# systemctl suspend

Rade isto što i shutdown.

Kad servis ne startuje

Redosled provere koji rešava skoro sve:

1. Status

# systemctl status httpd -l --no-pager

Poslednji redovi obično sadrže grešku.

2. Logovi

# journalctl -u httpd -n 50 --no-pager
# journalctl -u httpd --since "10 min ago"

Detaljno u lekciji journalctl.

3. Sintaksa konfiguracije

Servisi obično imaju sopstvenu proveru:

# httpd -t
# nginx -t
# sshd -t
# named-checkconf

Uvek proveri konfiguraciju pre restarta. Ako je pogrešna, servis se zaustavi i ne podigne — a ti ostaneš bez njega dok ne nađeš grešku.

Najčešći uzroci

PorukaŠta obično znači
Address already in useport zauzet; proveri sa ss -tulnp
Permission denieddozvole nad fajlom, ili SELinux
Unit not foundgreška u imenu ili paket nije instaliran
start request repeated too quicklyservis pada pri startu; pravi uzrok je u logu

Za onaj poslednji — posle ispravke:

# systemctl reset-failed httpd
# systemctl start httpd

Servis radi, ali nije dostupan spolja

Ako status kaže da radi, a ne možeš da mu priđeš — problem je u firewallu, ne u servisu:

# firewall-cmd --add-service=http --permanent
# firewall-cmd --reload

Više u lekciji firewalld.

Korisno pri analizi

$ systemctl list-dependencies httpd     šta servis zahteva
$ systemd-analyze                        koliko je trajalo butovanje
$ systemd-analyze blame                  koja jedinica je najsporija

Poslednja je odgovor kad se server diže tri minuta a ne znaš zašto.

Vežba

  1. Pogledaj status SSH servisa i pronađi da li je enabled
  2. Zaustavi i pokreni neki servis, pa prati promenu kroz systemctl status
  3. Proveri ima li na sistemu jedinica u stanju failed
  4. Izlistaj sve servise koji se pokreću pri butovanju
  5. Pogledaj unit fajl za sshd kroz systemctl cat
  6. Namerno napravi grešku u konfiguraciji Apache-a, pokušaj restart i pronađi uzrok samo kroz status i journalctl
  7. Pogledaj koliko je trajalo poslednje butovanje i šta ga je najviše usporilo

Povezano: journalctl · Proces butovanja Linuxa · shutdown · firewalld · Administracija i servisi

Comments

Popular posts from this blog

Početak u Linuxu — šta je i zašto se uči

Konverzija tipova podataka u Pythonu

groupadd