Controller.sh
Python スクリプト ( ) を呼び出すbash スクリプト ( ) がありますMyDaemon.py
。後者は引数とコマンドを取り、次のようにコマンド ラインから呼び出すことができます。
/usr/bin/python /opt/stuff/MyDaemon.py -p Blue start
また
/usr/bin/python /opt/stuff/MyDaemon.py -p Blue stop
また
/usr/bin/python /opt/stuff/MyDaemon.py -p Blue status
Controller.sh
呼び出してから、ステータスで終了しようとMyDaemon.py
しています。Python スクリプトが開始され、Controller.sh
返されるはずです。これは私の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
ここで、コマンド ラインで呼び出すController.sh blue start
と、Python スクリプトが開始されますがController.sh
、ステータスは返されません。一方、次を実行すると、次のように返されます。
[nford@myserver]# 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
[nford@myserver]#
bash スクリプトの復帰を妨げている何かがあると結論せざるを得ません。
MyDaemon.py
は fork プロセスを実行することに注意してください。そのため、出力をリダイレクトする必要があります。また、PHP スクリプトで同様のことを行う別のスクリプトからこの大部分を取り上げていることにも注意してください。あいまいな意味の一部 ( などSTATUS=$?
)。とはいえ、呼び出し行以降をすべて切り取っても、sudo taskset
きれいに返ってこない。bash スクリプトでこのコマンドを適切に実行するにはどうすればよいですか?
追記: この質問が「あまりにも具体的」であり、反対票を投じられたり、クローズするために投票されたりしたことに少し困惑しています。明確にするために。コマンド ラインと bash スクリプトのコンテキストで fork プロセス スクリプトを実行する方法の違いを理解しようとしています。上記で具体的な例を示しましたが、これは一般的な概念です。
更新: を使用してスクリプトを実行すると、これが発生しbash -x
、さらにその行で停止することが示されsudo taskset
ます。コマンドから除外されているという事実start
は混乱を招きます。
[nford@myserver]# 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
更新:
bash -x
問題を明らかにします:start
コマンドが渡されていません: 変数名のタイプミスがサイレント bash エラーとして生成されます。要点:bash -x
デバッグに使用してください!