Syn-3 services
Alle Syn-3 services draaien onder daemon tools. Dit systeem zorgt voor het starten en stoppen van de services, en zorgt ook dat een service geherstart word als hij onverwachts stopt.
Daemontools: source:trunk/npl/commonservers/daemontools
Beheerders frontend
Het beheren door de administrator kan via de SCC en rechstreeks via de daarvoor aanwezige 'frontend' scripts.
Een service naam is bijvoorbeeld /service/squid.
Als een service bij een reboot NIET gestart moet worden dient men de file /service/servicenaam/down aan te maken. Alle andere services worden wel gestart bij een reboot.
- svcstart servicenaam -- Start de service, en controleert of de service correct loopt. Keert terug met exit 0 als de service goed loopt, anders exit 1
- svcstop servicenaam -- Stopt de service en controleert of hij ook echt gestopt is. Keert terug met exit 0 als de service gestopt is, anders exit 1.
- svcreset servicenaam -- Reset de service naar de oorspronkelijke status. Dus hij doet svcstart als hij hoort te lopen en svcstop als hij down hoort te zijn. (als /service/servicenaam/down bestaat dus)
- svcrestart servicenaam -- Restart de service (Dus doet svcstop/start), maar ALLEEN als deze reeds loopt.
- svstat servicenaam -- Huidige status en uptime van een service weergeven.
Als men de services bedient via de SCC word automatisch een /service/servicenaam/down aangemaakt of verwijderd, zodat de status bij een reboot gelijk blijft.
Packaging en backend
Om een service te draaien maak je normaal een run-script aan in /service/servicenaam/run. Voorbeeld van een run-script dat de service onder een andere user draait:
#!/bin/bash doe-dingen-ter-voorbereiding... exec su - username -c "/usr/bin/programma parameters"
of (betere methode):
#!/bin/bash doe-dingen-ter-voorbereiding... exec setuidgid username /usr/bin/programma parameters
In een run script moet de service die uitgevoerd word op de voorgrond blijven draaien. Hier zijn vaak speciale parameters voor nodig. Als dit niet mogelijk is kan het programma fghack gebruikt. Dus fghack /usr/bin/programma.
De exec is nodig om te voorkomen dat er geen extra bash shell draait.
Vergeet niet om het run-script executable te maken!
Andere handige deamontools hulp programmas:
- http://cr.yp.to/daemontools/softlimit.html -- Stel limieten in voor memory/disk/cpu gebruik.
- http://cr.yp.to/daemontools/setlock.html -- Hulptool om files te locken
- http://cr.yp.to/daemontools/multilog.html -- Vangt de stdout/stderror van het script af en logt dit.
Controleren of je het goed gedaan hebt
Start problemen
Probeer de eerste keer het script te starten en stoppen met svcstart en svcstop en kijk of alles goed gaat. Zo zien services er uit:
6166 tty1 Ss+ 0:00 /bin/sh /usr/bin/svscanboot 6219 tty1 S+ 0:00 \_ svscan /service 6224 tty1 S+ 0:00 | \_ supervise amavis 6229 ? Ss 0:00 | | \_ amavisd (master) 10101 ? S 0:00 | | \_ amavisd (ch9-avail) 1724 ? S 0:00 | | \_ amavisd (ch8-avail) 12935 ? S 0:00 | | \_ amavisd (ch6-avail) 18906 ? S 0:00 | | \_ amavisd (ch3-avail) 4587 ? S 0:00 | | \_ amavisd (virgin child) 6225 tty1 S+ 0:00 | \_ supervise log 6233 tty1 S+ 0:00 | | \_ multilog t s250000 ./main 6226 tty1 S+ 0:00 | \_ supervise apache2 6227 ? Ss 0:01 | | \_ /usr/sbin/httpd -f /etc/apache2/httpd.conf -D NO_DETACH -D FOREGROUND 6704 ? S 0:00 | | \_ /usr/sbin/httpd -f /etc/apache2/httpd.conf -D NO_DETACH -D FOREGROUND 6705 ? S 0:00 | | \_ /usr/sbin/httpd -f /etc/apache2/httpd.conf -D NO_DETACH -D FOREGROUND 6706 ? S 0:00 | | \_ /usr/sbin/httpd -f /etc/apache2/httpd.conf -D NO_DETACH -D FOREGROUND 6707 ? S 0:00 | | \_ /usr/sbin/httpd -f /etc/apache2/httpd.conf -D NO_DETACH -D FOREGROUND 6740 ? S 0:00 | | \_ /usr/sbin/httpd -f /etc/apache2/httpd.conf -D NO_DETACH -D FOREGROUND 11192 ? S 0:00 | | \_ /usr/sbin/httpd -f /etc/apache2/httpd.conf -D NO_DETACH -D FOREGROUND 30577 ? S 0:00 | | \_ /usr/sbin/httpd -f /etc/apache2/httpd.conf -D NO_DETACH -D FOREGROUND .....etc.... 6220 tty1 S+ 1:25 \_ readproctitle service errors: ...known id: download?Unknown id: download?Unknown id: downl
Iedere service krijgt dus automatisch zn eigen supervise toegevewezen. Zodra een service crashed of afsluit word deze binnen een seconde gerestart. Aan het pid of met svstat kun je zien of de service wel up blijft.
Output die van een script komt word afgevangen door readproc title:
[Syn-3] root@kantoor.datux.nl ~# ps fax |grep readproc 14806 pts/0 S+ 0:00 \_ grep readproc 6220 tty1 S+ 1:25 \_ readproctitle service errors: ...known id: download?Unknown id: download?Unknown id: download?Unknown id: download?Unknown id: download?Unknown id: download?Unknown id: download?Unknown id: download?Unknown id: download?Unknown id: download?Unknown id: download?Unknown id: download?Unknown id: download?Unknown id: download?Unknown id: download?Unknown id: download?Unknown id: download?Unknown id: download?Unknown id: download?
Dit kan je gebruiken om een steeds crashende service te debuggen. Ook kan het handig zijn om het run-script dat problemen geeft direkt te starten zodat je de output beter ziet:
[Syn-3] root@kantoor.datux.nl ~# svcstop /service/mldonkey/ Stopping /service/mldonkey/ ....OK [Syn-3] root@kantoor.datux.nl ~# /service/mldonkey/run '''Unknown id: download''' [Syn-3] root@kantoor.datux.nl ~# cat /service/mldonkey/run #!/bin/bash rm ~download/.mldonkey/*tmp &>/dev/null ulimit -n 10000 exec su - download -c "mldonkey -allowed_ips 255.255.255.255"
In dit geval was het probleem dat de user download niet bestond. (Deze moet normaal automatisch worden aangemaakt in het postinstall script.)
Stop problemen
Soms is het zo dat een service niet correct afsluit als je svcstop doet en onder daemon tools wegvalt. Hij zal dan onderaan de process list staan. Meestal komt dit doordat je een exec vergeet. Soms restart het programma in een andere session, daarvoor kan je pgrphack gebruiken. (op dezelfde manier als fghack).
Het kan ook zijn dat je ander wrapper script aanroept (en niet rechtstreeks de binary), zoals bij safe_mysqld. Kijk in het mysql runscript voor een voorbeeld hoe je dit kan oplossen.
Start/stop controle scripts
Als je wilt dat svcstart pas terug keert nadat de service getest op correcte werking maak je een start script. Zon script zet je in /service/servicenaam/start.
Dit is een voorbeeld van /service/slapd/start:
#!/bin/bash TRY=15 svc -u /service/slapd while ! ldapwhoami -h 127.0.0.1 &>/dev/null; do echo "Waiting for slapd to start.. ($TRY)" sleep 5 (( TRY-- )) if [ $TRY -eq 0 ]; then syn3-state slapd CAUTION "Startup error" svc -d /service/slapd exit 1 fi done syn3-state slapd OK "Started"
Het start script word aangeroepen als men svcstart gebruikt. Het script is op dat moment verantwoordelijk voor het starten van de service via het backend svc-commando.
- Het script moet herhaaldelijk controleren of de service correct draait en dan exitten met code 0 als dit het geval is.
- Als de service na een bepaald tijd nog niet draait moet de service weer down en het script exitten met code 1.
Hierdoor weet svcstart dat het gelukt of mislukt is en kan dit doorgeven aan de hogerliggende scripts.
Ook is dit de juiste plaats om monitoring meldingen van de destbetreffende services in op te slaan. (Zie SynMonitor)
Op een zelfde manier kan een service ook een stop script maken in /service/servicenaam/stop.
Notities edwin: Het streven is om alle services degelijke scripts te geven, zodat het systeem zichzelf monitored bij het starten van services. svstart is nu een wrapper dat de start-scripts aanroept, maar ik wil eigenlijk nog een patch maken voor daemontools, zodat deze dit zelf ondesteund, dus ook bij de automatische herstart van een crashende service. Misschien moet hij een crashende service zelfs melden bij het monitoring systeem.
svc (backend tool)
svc word normaal alleen aangeroepen door deze start/stop wrapper-scripts en niet door de eind gebruiker zelf:
svc opts services opts is a series of getopt-style options. services consists of any number of arguments, each argument naming a directory used by supervise. svc applies all the options to each service in turn. Here are the options: -u: Up. If the service is not running, start it. If the service stops, restart it. -d: Down. If the service is running, send it a TERM signal and then a CONT signal. After it stops, do not restart it. -o: Once. If the service is not running, start it. Do not restart it if it stops. -p: Pause. Send the service a STOP signal. -c: Continue. Send the service a CONT signal. -h: Hangup. Send the service a HUP signal. -a: Alarm. Send the service an ALRM signal. -i: Interrupt. Send the service an INT signal. -t: Terminate. Send the service a TERM signal. -k: Kill. Send the service a KILL signal. -x: Exit. supervise will exit as soon as the service is down. If you use this option on a stable system, you're doing something wrong; supervise is designed to run forever.