Pascal vraagt het zich al af: "Rebooten, kan Linux dat dan".
Het antwoord is "Ja", echter vaak kan je volstaan met het herstarten van een programma.
Het komt wel eens voor dat je een daemon opnieuw moet starten omdat het conguratie bestand alleen bij het starten van het programma gelezen wordt (voorbeelden hiervan zijn inetd, httpd, syslogd maar er zijn er veel meer).
Je kunt dan uiteraard rebooten zoals bij sommige andere OSen. Dat werkt echter niet echt prettig, bovendien heeft Linux een mechanisme in huis om dit soort dingen te regelen. En dat is process management.
Alhoewel er vast wel X applicaties zijn die dit allemaal kunnen gebruik ik altijd de console voor dit soort acties. En wel de volgende programma's (samen met wat *nix fit-werk):
PS(1) Linux User's Manual PS(1) NAME ps - report process status SYNOPSIS ps [options] DESCRIPTION ps gives a snapshot of the current processes. If you want a repetitive update of this status, use top. This man page documents the /proc-based version of ps, or tries to. |
Een van de dingen die ps kan raporteren over draaiende processen is de PID. Ik gebruik daar altijd de optie -e voor:
-e select all processes |
Een voorbeeld van z'n output is bijvoorbeeld:
bilbo@bilbo:~$ ps -e PID TTY TIME CMD 1 ? 00:00:04 init 2 ? 00:00:00 keventd 3 ? 00:00:00 ksoftirqd_CPU0 4 ? 00:00:00 kswapd 5 ? 00:00:00 bdflush 6 ? 00:00:00 kupdated 7 ? 00:00:00 mdrecoveryd 8 ? 00:00:00 kreiserfsd 21 ? 00:00:00 loop0 22 ? 00:00:00 loop1 36 ? 00:00:00 khubd 55 ? 00:00:00 dhcpcd 64 ? 00:00:00 named 184 ? 00:00:00 syslogd 187 ? 00:00:00 klogd 189 ? 00:00:00 inetd 191 ? 00:00:00 fetchmail 203 ? 00:00:00 lpd 206 ? 00:00:00 crond 209 ? 00:00:00 atd 212 ? 00:00:00 sendmail 215 ? 00:00:00 sendmail 220 ? 00:00:00 httpd 222 ? 00:00:00 gpm 224 tty1 00:00:00 agetty 225 tty2 00:00:00 bash 226 tty3 00:00:00 agetty 227 tty4 00:00:00 agetty 228 tty5 00:00:00 agetty 229 tty6 00:00:00 agetty 230 ? 00:00:00 httpd 231 ? 00:00:00 httpd 232 ? 00:00:00 httpd 233 ? 00:00:00 httpd 234 ? 00:00:00 httpd 245 tty2 00:00:00 startx 252 tty2 00:00:00 xinit 253 ? 00:00:10 X 257 tty2 00:00:00 xinitrc 262 tty2 00:00:00 bbmail 263 tty2 00:00:00 blackbox 269 ? 00:00:09 mozilla-bin 296 ? 00:00:00 mozilla-bin 297 ? 00:00:00 mozilla-bin 298 ? 00:00:00 mozilla-bin 300 ? 00:00:00 mozilla-bin 307 ? 00:00:00 httpd 311 ? 00:00:00 rxvt 312 pts/0 00:00:00 bash 328 ? 00:00:00 mozilla-bin 330 pts/0 00:00:00 ps bilbo@bilbo:~$ |
Dit zijn dus alle processen op mijn systeem die draaien op het moment dat ik commandp `ps -e` geef.
Ik heb bewust niet ge-snipt in de lijst om aan te geven dat het er vrij veel zijn. Vaak scrolt de lijst van je scherm.
Vandaar ook dat......
grep:
Uit de manpage
GREP(1) GREP(1) NAME grep, egrep, fgrep - print lines matching a pattern SYNOPSIS grep [options] PATTERN [FILE...] grep [options] [-e PATTERN | -f FILE] [FILE...] DESCRIPTION Grep searches the named input FILEs (or standard input if no files are named, or the file name - is given) for lines containing a match to the given PATTERN. By default, grep prints the matching lines. |
Grep is een programma met veel krachtige opties. Voor ons doel echter volstaat de default aktie van grep: het printen van regels die overeenkomen. We moeten uitsluitend zoeken naar een patroon in een aantal regels.
We zouden dit kunnen doen door de output van `ps -e` tijdelijk op te slaan in een bestand. Ook dit is echter weer niet de *nix manier van zaken doen.
Het is tijd om een *nix loodgieter te worden..... we gaan pipen (spreekt uit paipen).
Grep kan in plaats van een bestand ook de standaar input gebruiken als invoer. En dit kan heel gemakkelijk de uitvoer van een ander programma zijn, bijvoorbeeld `ps -e`.
Om de output van het ene programma te pipen naar een volgend programma wordt het pipe symbool, | (meestal 2 vertikale streepjes op je toetsenbord), te gebruiken.
Stel ik ben op zoek naar het PID van inetd, dan geef ik het commando `ps -e|grep inetd`. Dit levert de volgende output op:
bilbo@bilbo:~$ ps -e | grep inetd 189 ? 00:00:00 inetd bilbo@bilbo:~$ |
En voila, daar staat het PID van indetd.
Vervolgens kun je nu dus.....
kill:
Uit de manpage
KILL(1) Linux User's Manual KILL(1) NAME kill - send a signal to a process SYNOPSIS kill pid ... Send SIGTERM to every process listed. kill signal pid ... Send a signal to every process listed. kill -s signal pid ... Send a signal to every process listed. kill -l List all signal names. kill -l signal Convert a signal number into a name. DESCRIPTION The default signal for kill is TERM. Use -l or -L to list available signals. Particularly useful signals include HUP, INT, KILL, STOP, CONT, and 0. Alternate signals may be specified in three ways: -9 -SIGKILL -KILL. |
Kill stuurt dus een bepaalt signaal naar een process wat geindentificeert wordt door een PID. Het standaart signaal is TERM, en die hebben wij dus niet nodig.
De manpage geeft de volgende signaal mogelijkheden:
SIGNALS The signals listed below may be available for use with kill. When known constant, numbers and default behavior are shown. Name Num Action Description () () ALRM 14 exit HUP 1 exit INT 2 exit KILL 9 exit this signal may not be blocked PIPE 13 exit POLL exit PROF exit TERM 15 exit USR1 exit USR2 exit VTALRM exit STKFLT exit may not be implemented PWR ignore may exit on some systems WINCH ignore CHLD ignore URG ignore TSTP stop may interact with the shell TTIN stop may interact with the shell TTOU stop may interact with the shell STOP stop this signal may not be blocked CONT restart continue if stopped, otherwise ignore ABRT 6 core FPE 8 core ILL 4 core QUIT 3 core SEGV 11 core TRAP 5 core SYS core may not be implemented EMT core may not be implemented BUS core core dump may fail XCPU core core dump may fail XFSZ core core dump may fail |
Het signaal wat wij nodig hebben is HUP. Dit kan aangeroepen worden met de optie -HUP, -SIGHUP of -1, zelf gebruik ik altijd -HUP.
Om inetd opnieuw het configuratie bestand te laten lezen moet ik dus het commando `kill -HUP 189`. De output van dit commando is niet opzienbarend:
bilbo@bilbo:~$ kill -HUP 189 bash: kill: (189) - Operation not permitted bilbo@bilbo:~$ |
Oeps, je moet natuurlijk wel root zijn om dit te kunnen doen:
bilbo@bilbo:~$ su Password: root@bilbo:/home/bilbo# kill -HUP 189 root@bilbo:/home/bilbo# exit exit bilbo@bilbo:~$ |
That's it, incl een su naar root en een exit weer terug naar bilbo.
Meer is het niet!
Synopsis:
bilbo@bilbo:~$ ps -e | grep inetd 189 ? 00:00:00 inetd bilbo@bilbo:~$ su Password: root@bilbo:/home/bilbo# kill -HUP 189 root@bilbo:/home/bilbo# exit exit bilbo@bilbo:~$ |
Of is er wel meer?
Sommige processen reageren niet goed op het signaal -HUP. Ze sterven simpelweg af en komen niet meer terug. Is geen drama, je kunt het process altijd wel weer starten.
Maar het motto is wel dat je na een -HUP ff met `ps -e | grep [naam]` moeten kijken of het process weer draait.
Je zou nog meer loodgieterswerk kunnen gebruiken door de output van grep te pipen naar cut, en de output van cut vervolgens te pipen naar kill. Persoonlijk doe ik dit nooit om een process te herstarten, want.
Dit kan problemen opleveren. Neem bijvoolbeeld de httpd daemon.
Als je ps de optie --forest meegeeft, dan krijg je een soort van ASCII grafische weergave van de processen:
bilbo@bilbo:~$ ps -e --forest|grep httpd 220 ? 00:00:00 httpd 230 ? 00:00:00 \_ httpd 231 ? 00:00:00 \_ httpd 232 ? 00:00:00 \_ httpd 233 ? 00:00:00 \_ httpd 234 ? 00:00:00 \_ httpd 307 ? 00:00:00 \_ httpd bilbo@bilbo:~$ |
Je ziet dan dat er meerdere instanties van httpd actief zijn. Het moederprocess met het PID 220, 5 kinderen met de PIDs 230 t/m 234 die wachten op een verbinding, en 1 actieve sessie met PID 307.
Welke moet je nu herstarten?
Je zou het PID wat je moet herstarten kunnen opzoeken in de directorie /var/run. Apache maakt het je echter gemakkelijk, er is een tooltje speciaal om apache te herstarten: apachectl.
Deze tool geef je de optie -restart mee, en vervolgens zal httpd opnieuw starten.
root@bilbo:~# apachectl restart /usr/sbin/apachectl restart: httpd restarted root@bilbo:~# |
In feite is apachectl een shell script wat de juiste PID opzoekt in /var/run en dit vervolgens gebruikt voor het herstarten. Bekijk het script maar eens als je tijd hebt.