2010-09-17 4 views
12

Ich habe ein Shell-Skript geschrieben, um HAProxy (Reverse-Proxy) neu zu starten. Das Ausführen des Skripts aus der Shell funktioniert. Aber ich möchte, dass ein Daemon das Skript ausführt. Das funktioniert nicht. system() gibt 256 zurück. Ich habe keine Ahnung, was das bedeuten könnte.Das Ausführen von Shell-Skript mit system() gibt 256 zurück. Was bedeutet das?

#!/bin/sh 
# save previous state 
mv /home/haproxy/haproxy.cfg /home/haproxy/haproxy.cfg.old 
mv /var/run/haproxy.pid /var/run/haproxy.pid.old 

cp /tmp/haproxy.cfg.new /home/haproxy/haproxy.cfg 
kill -TTOU $(cat /var/run/haproxy.pid.old) 
if haproxy -p /var/run/haproxy.pid -f /home/haproxy/haproxy.cfg; then 
    kill -USR1 $(cat /var/run/haproxy.pid.old) 
    rm -f /var/run/haproxy.pid.old 
    exit 1 
else 
    kill -TTIN $(cat /var/run/haproxy.pid.old) 
    rm -f /var/run/haproxy.pid 
    mv /var/run/haproxy.pid.old /var/run/haproxy.pid 
    mv /home/haproxy/haproxy.cfg /home/haproxy/haproxy.cfg.err 
    mv /home/haproxy/haproxy.cfg.old /home/haproxy/haproxy.cfg 
    exit 0 
fi 

HAProxy wird mit dem Benutzer haproxy ausgeführt. Mein Daemon hat auch einen eigenen Benutzer. Beide laufen mit sudo.

Irgendwelche Hinweise?

Antwort

26

Nach this und that, Perl system() kehrt Ausgang Wert multipliziert mit 256. So ist es eigentlich mit 1 verlassen. Es scheint this happens in C too.

+1

Danke! Also ist es EPERM/* Operation nicht erlaubt */... aber warum ... starte ich den Daemon mit sudo. –

+3

Perl gibt keine multiplizierten Ausgangswerte zurück. Es gibt einen 16-Bit-Wert zurück, wobei der Exit-Code in den höheren 8 Bits liegt. Es ist oft dasselbe, aber nicht immer. – mivk

+0

Dies gilt auch für die meisten Linux/gcc-Binärdateien, nicht nur für Perl. –

6

Sofern das System -1 zurückgibt, hat sein Rückgabewert das gleiche Format wie der Statuswert aus der Systemfamilie der Wartezeiten (man 2 wait). Es gibt Makros, mit deren Hilfe Sie diesen Status interpretieren können:

man 3 wait 

Listet diese Makros und was sie Ihnen sagen.

0

Ein Code von 256 bedeutet wahrscheinlich, dass der Systembefehl die Binärdatei nicht finden kann, um sie auszuführen. Denken Sie daran, dass es bash möglicherweise nicht aufruft und dass es möglicherweise keine Pfade eingerichtet hat. Versuchen Sie es erneut mit vollständigen Pfaden zu den Binärdateien!

+0

Nein. Wenn die ausführbare Datei nicht gefunden werden konnte, würde -1 zurückgegeben. – mivk

0

Ich habe das gleiche Problem, wenn Call-Skript, das `Kill 'Befehl in einem Daemon enthält. Der Daemon muss die stdout geschlossen haben, stderr ... Verwenden Sie etwas wie System ("scrips.sh>/dev/null") sollte funktionieren.