Upravljanje servisima alatom update-rc.d

Svaki servis kojeg instalirate na poslužitelj, osim izvršnih datoteka, sadrži i pomoćne datoteke (manual, popis promjena i slično), ali i inicijalizacijske skripte, koje nas u ovom trenutku najviše i zanimaju. Debian rabi inicijalizacijske skripte u Unix System-V stilu, a s njima je najlakše upravljati pomoću malog uslužnog programa - update-rc.d.

Ruku na srce, za postojanje ovog programa gotovo i ne morate znati, jer sve što on može, možete napraviti i ručno. Update-rc.d se rabi najviše u instalacijskim skriptama (preinst, postinst, prerm, postrm) koje se nalaze u direktoriju /var/lib/dpkg/info. Razlog zašto ga spominjemo je problem kojeg smo zaprimili na SysHelpu, gdje se jedan servis nije pokretao nakon restarta.

Ukratko, svi servisi koji se moraju pokrenuti prilikom pokretanja poslužitelja, moraju imati simbolički link na inicijalizacijsku datoteku, /etc/init.d/<servis>. Linkovi se nalaze u direktorijima /etc/rcX.d, gdje je X broj od 0-6, odnosno slovo "S". Ovi brojevi odgovaraju trenutnoj razini rada, odnosno u originalu runlevel.

Srećom, Debian ima jako pojednostavljen sustav, pa je:

0 ili N sustav se gasi
1 ili S jednokorisnički način rada
2 do 5 višekorisnički način rada, mreža, GUI
6 sustav se restarta

Simbolički linkovi na startup datoteku se nalaze u tim direktorijima, a nazivaju se ili "S" (start) ili "K" (kill), primjerice:

lrwxrwxrwx 1 root root 16 12:14 /etc/rc0.d/K20vsftpd -> ../init.d/vsftpd
lrwxrwxrwx 1 root root 16 12:14 /etc/rc1.d/K20vsftpd -> ../init.d/vsftpd
lrwxrwxrwx 1 root root 16 12:14 /etc/rc2.d/S20vsftpd -> ../init.d/vsftpd
lrwxrwxrwx 1 root root 16 12:14 /etc/rc3.d/S20vsftpd -> ../init.d/vsftpd
lrwxrwxrwx 1 root root 16 12:14 /etc/rc4.d/S20vsftpd -> ../init.d/vsftpd
lrwxrwxrwx 1 root root 16 12:14 /etc/rc5.d/S20vsftpd -> ../init.d/vsftpd
lrwxrwxrwx 1 root root 16 12:14 /etc/rc6.d/K20vsftpd -> ../init.d/vsftpd

Dakle, vsftpd će se pokretati u runlevelima 2 do 5, a gasiti u runlevelima 0, 1 i 6. Upravo je to pretpostavljena vrijednost naredbe update-rc.d:

# grep update-rc.d /var/lib/dpkg/info/vsftpd.postinst
update-rc.d vsftpd defaults >/dev/null

Bez ikakvih opcija, update-rc.d će staviti "S" linkove u rc.d direktorije od 2 do 5, a "K" linkove u rc.d direktorije 0, 1 i 6.

Brojevi iza slova omogućavaju finu gradaciju redosljeda pokretanja servisa, pa će se servis vsftpd (S20) pokrenuti poslije web poslužitelja apache2 (S09). Ukoliko želimo da se neki servis starta prije ili poslije nekoga drugoga, update-rc.d ćemo upotrijebiti u ovom obliku:

# update-rc.d vsftpd defaults 24

Linkovi će tada imati imena S24vsftpd, odnosno K24vsftpd.

Update-rc.d prima i druge parametre, pa tako možemo osigurati da se servis A starta prije i gasi poslije servisa B:

# update-rc.d servisA defaults 80 20
# update-rc.d servisB defaults 90 10

Servis A će se tako postati S80servisA i K20servisA, pa će se startati prije servisa B (K80 < K90), ali i gasiti poslije njega (K20 > K10).

Pomoću ove naredbe moguće je brzo onemogućiti neki servis:

# update-rc.d -f vsftpd remove
Removing any system startup links for /etc/init.d/vsftpd ...
/etc/rc0.d/K20vsftpd
/etc/rc1.d/K20vsftpd
/etc/rc2.d/S20vsftpd
/etc/rc3.d/S20vsftpd
/etc/rc4.d/S20vsftpd
/etc/rc5.d/S20vsftpd
/etc/rc6.d/K20vsftpd

Naravno, postoji još opcija, pa je tako moguće zasebno za svaki runlevel odrediti kada će se neki servis pokretati, odnosno gasiti. Sintaksa je sljedeća:

# update-rc.d servis start 10 2 3 4 5 . stop 90 0 1 6 .

Servis će se startati vrlo rano, a gasiti vrlo kasno, što je pogodno ukoliko se radi o nekom bazičnom servisu o kojem ovisi drugi servisi (daemoni). Obično se uzima da je vrijeme gašenja "100 minus vrijeme starta" (start 10, stop 100-10=90), ali to nije uvijek slučaj.

Ukoliko vas zanima što se kolegi koji je prijavio problem dogodilo, probajte sami zaključiti (rabio je jedan drugi alat za upravljanje):

lrwxrwxrwx 1 root root 12:05 rc0.d/K24dovecot -> ../init.d/dovecot
lrwxrwxrwx 1 root root 12:05 rc1.d/K24dovecot -> ../init.d/dovecot
lrwxrwxrwx 1 root root 12:05 rc2.d/K24dovecot -> ../init.d/dovecot
lrwxrwxrwx 1 root root 12:05 rc3.d/K24dovecot -> ../init.d/dovecot
lrwxrwxrwx 1 root root 12:05 rc4.d/K24dovecot -> ../init.d/dovecot
lrwxrwxrwx 1 root root 12:05 rc5.d/K24dovecot -> ../init.d/dovecot
lrwxrwxrwx 1 root root 12:05 rc6.d/K24dovecot -> ../init.d/dovecot
Ukoliko pobliže pogledate, svi su linkovi "K" linkovi, dakle jadni dovecot nije imao šanse za start niti u jednom runlevelu. Rješenje je jednostavno, može se riješiti preko update-rc.d, ali i ručno:
# update-rc.d -f remove dovecot
ili
# find /etc/rc*d -name \*dovecot | xargs rm
Poslije toga treba pozvati naredbu update-rc.d, najbolje u obliku u kojem se nalazi u postinst skripti (kod vas je broj možda drukčiji, ali sam broj nije od presudne važnosti):
# grep update-rc.d /var/lib/dpkg/info/dovecot-common.postinst
update-rc.d dovecot defaults 24>/dev/null
# update-rc.d dovecot defaults 24
Adding system startup for /etc/init.d/dovecot ...
/etc/rc0.d/K24dovecot -> ../init.d/dovecot
/etc/rc1.d/K24dovecot -> ../init.d/dovecot
/etc/rc6.d/K24dovecot -> ../init.d/dovecot
/etc/rc2.d/S24dovecot -> ../init.d/dovecot
/etc/rc3.d/S24dovecot -> ../init.d/dovecot
/etc/rc4.d/S24dovecot -> ../init.d/dovecot
/etc/rc5.d/S24dovecot -> ../init.d/dovecot
I problem je riješen.

 

 

Kuharice: 
Kategorije: 
Vote: 
0
No votes yet

Komentari

U članku je pogrešno napisana naredba za onemogućavanje servisa dovecot. Ispravna naredba je:

# update-rc.d -f dovecot remove

-- rpr.