2010-09-17 8 views
12

Ho scritto uno script di shell per riavviare soft-HAProxy (reverse proxy). L'esecuzione dello script dalla shell funziona. Ma voglio un demone per eseguire lo script. Questo non funziona. system() restituisce 256. Non ho idea di cosa possa significare.L'esecuzione dello script di shell con system() restituisce 256. Che cosa significa?

#!/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 viene eseguito con utente haproxy. Il mio demone ha anche il proprio utente. Entrambi corrono con sudo.

Eventuali suggerimenti?

risposta

26

Secondo this e that, system() valori rendimenti uscita del Perl moltiplicato per 256. Così è in realtà uscire con 1. Sembra this happens in C too.

+1

Grazie! Quindi è l'operazione EPERM/* non consentita */... ma perché ... avvio il demone con sudo. –

+3

Perl non restituisce i valori di uscita moltiplicati. Restituisce un valore a 16 bit, con il codice di uscita negli 8 bit più alti. Spesso è lo stesso, ma non sempre. – mivk

+0

Questo vale anche per la maggior parte dei binari Linux/gcc, non solo Perl. –

6

A meno che il sistema non restituisca -1 il suo valore di ritorno è dello stesso formato del valore di stato della famiglia di attesa delle chiamate di sistema (man 2 wait). Ci sono delle macro che consentono di interpretare questo stato:

man 3 wait 

Elenca queste macro e quello che ti dicono.

0

Un codice di 256 probabilmente significa che il comando di sistema non può individuare il binario per eseguirlo. Ricorda che potrebbe non essere chiamato bash e che potrebbe non avere configurazione dei percorsi. Riprova con percorsi completi ai binari!

+0

No. Se non è stato trovato l'eseguibile, restituisce -1. – mivk

0

Ho lo stesso problema quando lo script di chiamata che contiene il comando `kill 'in un demone. Il demone deve aver chiuso lo stdout, stderr ... Utilizzare qualcosa come sistema ("scrips.sh>/dev/null") dovrebbe funzionare.

Problemi correlati