2013-02-14 2 views
2

J'ai un script bash (Controller.sh) qui appelle un script python (MyDaemon.py). Ce dernier prend un argument et une commande, et peut être invoqué à partir de la ligne de commande comme ceci:Retour à partir du script bash qui appelle un script python

/usr/bin/python /opt/stuff/MyDaemon.py -p Blue start 

ou

/usr/bin/python /opt/stuff/MyDaemon.py -p Blue stop 

ou

/usr/bin/python /opt/stuff/MyDaemon.py -p Blue status 

Je cherche à obtenir Controller.sh à appelez MyDaemon.py, puis quittez avec un statut. Le script python devrait être lancé et Controller.sh devrait revenir. Ceci est mon code Controller.sh:

COLOR=$1 
COMMAND=$2 

DIRNAME=`dirname $0` 
RESULT="/tmp/$COLOR.$COMMAND.result" 

# remove any old console output 
rm -f $RESULT 2>/dev/null 

#start with CPU affinity for anything other than CPU 0. 
sudo taskset -c 1-8 /usr/bin/python /opt/stuff/MyDaemon.py -p $COLOR $COMMMAND</dev/null >$RESULT 2>&1 

STATUS=$? 

# print output 
cat $RESULT 

# check on success 
if [ $STATUS -ne 0 ] 
then 
     echo "ERROR: $COLOR $COMMAND failed" 
     exit 1 
fi 

Maintenant, si sur la ligne de commande, j'invoque Controller.sh blue start ce coup d'envoi de script python, mais Controller.sh ne retourne pas de statut. D'autre part, si je lance ce qui suit, il ne retourne:

[[email protected]]# sudo taskset -c 1-8 /usr/bin/python /opt/stuff/MyDaemon.py -p blue start</dev/null >/tmp/blah.log 2>&1 
Started with pid 1326 
[[email protected]]# 

Je suis forcé de conclure qu'il ya quelque chose au sujet du script bash qui l'empêche de revenir.

Il est à noter que MyDaemon.py fait des processus de fourche, c'est pourquoi j'ai besoin de rediriger la sortie. Il convient également de noter que je retire la majorité de ceci d'un autre manuscrit qui fait quelque chose de semblable avec un manuscrit de PHP; certains de la signification que je suis floue (comme STATUS=$?). Cela dit, même si je supprime tout après la ligne d'appel sudo taskset, il ne parvient toujours pas à revenir proprement. Comment puis-je obtenir le script bash pour exécuter correctement cette commande? Post-scriptum: Je suis un peu perplexe comment cette question est «trop spécifique» et a été votée/votée pour fermer. Dans une tentative d'être limpide; J'essaie de comprendre les différences dans la façon dont un script de processus de forking s'exécute dans le contexte de la ligne de commande par rapport à un script bash. J'ai donné un exemple spécifique ci-dessus, mais c'est un concept général.

MISE À JOUR: Il en résulte lorsque je cours le script en utilisant bash -x, montrant en outre qu'il meurt sur la ligne sudo taskset. Le fait qu'il soit laissé sur la commande start est déroutant.

[[email protected]]# bash -x Controller.sh Blue start 
+ COLOR=Blue 
+ COMMAND=start 
++ dirname Controller.sh 
+ DIRNAME=. 
+ RESULT=/tmp/Blue.start.result 
+ rm -f /tmp/Blue.start.result 
+ sudo taskset -c 1-8 /usr/bin/python /opt/stuff/MyDaemon.py -p Blue 

MISE À JOUR: bash -x révèle le problème: la commande start n'est pas passé à travers: une faute de frappe dans le nom de la variable produit comme une erreur bash silencieuse. Takeaway: utilisez bash -x pour le débogage!

+0

Je ne pense pas ... 'cat' va, je crois lire' $ RESULT' dans '$ STATUS'. Ensuite, je vérifie pour voir si $ STATUS est vide.Peu importe, le problème vient avant ce point. Je l'inclue ici pour montrer ce que j'essaie de faire. –

+0

Je crois que chaque script a un statut de retour, sauf s'il est toujours en cours d'exécution. Êtes-vous incapable d'obtenir un statut de retour? – AlexLordThorsen

+0

Le script bash semble continuer à s'exécuter, même si le script sous-jacent doit simplement reprendre le contrôle. Par conséquent, il n'y a pas de statut de retour. –

Répondre

1

En raison de votre faute de frappe - Vous devez utiliser set -u en haut de vos scripts, c'est un épargnant de vie et arrête les nuits blanches ainsi que de nier le tirage des cheveux.

set -u auriez-vous donné ...

myscript.sh: line 11: COMMMAND: unbound variable 

Rappelez-vous que vous pouvez exécuter des scripts comme si bash -u myscript.sh arg1 arg2 même avec -x, ils aident à la fois, il traquer les problèmes de script.

Questions connexes