wiki:SynServices

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:

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.
Last modified 10 years ago Last modified on 08/08/08 00:10:41