2

Controller.shPython スクリプト ( ) を呼び出す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デバッグに使用してください!

4

1 に答える 1

1

タイプミスのためset -u、スクリプトの先頭で使用する必要があります。これは命の恩人であり、眠れない夜を止め、髪の引っ張りを無効にします。

set -uあなたに与えただろう...

myscript.sh: line 11: COMMMAND: unbound variable

のようにスクリプトを実行できることを覚えておいてくださいbash -u myscript.sh arg1 arg2-xどちらもスクリプトの問題を追跡するのに役立ちます。

于 2013-02-15T10:49:47.327 に答える