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!
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. –
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
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. –