web-dev-qa-db-fra.com

L'exécution d'un script Shell avec system () renvoie 256. Qu'est-ce que cela signifie?

J'ai écrit un script Shell pour redémarrer HAProxy (proxy inverse). L'exécution du script à partir du shell fonctionne. Mais je veux un démon pour exécuter le script. Ça ne marche pas. system() renvoie 256. Je ne vois pas ce que cela pourrait vouloir dire.

#!/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 est exécuté avec l'utilisateur haproxy. Mon démon a aussi son propre utilisateur. Les deux courent avec Sudo.

Des allusions?

14
Jan Deinhard

Selon this et that , system() de Perl renvoie les valeurs de sortie multipliées par 256. Il s’agit donc de quitter avec 1. Il semble que cela se produit aussi dans C .

29
Skilldrick

À moins que le système ne retourne -1, sa valeur de retour est du même format que la valeur de statut de la famille d'appels en attente (man 2 wait). Il existe des macros pour vous aider à interpréter ce statut:

man 3 wait

Répertorie ces macros et ce qu'elles vous disent.

6
nategoose

Un code de 256 signifie probablement que la commande système ne peut pas localiser le binaire pour l'exécuter. Rappelez-vous qu’il n’appelle peut-être pas bash et que les chemins ne sont pas configurés. Réessayez avec des chemins complets vers les fichiers binaires!

0
user2000703

J'ai le même problème quand un script d'appel contenant la commande "kill" dans un démon. Le démon doit avoir fermé le stdout, stderr ... Utiliser quelque chose comme système ("scrips.sh>/dev/null ") devrait fonctionner.

0
Morris