我有一个调用python脚本(MyDaemon.py
)的bash脚本(Controller.sh
)。后者需要一个参数和命令,可以通过命令行来调用,像这样:从调用python脚本的bash脚本返回
/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
不返回一个状态。在另一方面,如果我运行下面的它返回:
[[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]]#
我不得不得出结论,有一些事是防止它返回bash脚本。
需要注意的是MyDaemon.py
没有fork过程,这就是为什么我需要重定向输出。还应该注意的是,我将其中的大部分内容从另一个脚本中解放出来,这些脚本与php脚本类似;一些我很模糊的含义(如STATUS=$?
)。也就是说,即使我在sudo taskset
调用行后删除了所有内容,它仍然无法清晰地返回。如何获得bash脚本以正确执行此命令?
Post-Script:我对这个问题是如何“太具体”并且被低估/投票结束感到有点困惑。试图澄清;我试图理解在命令行和bash脚本的上下文中分叉进程脚本的差异。我已经提供了一个特定的例子,但这是一个普遍的概念。
更新: 当我使用bash -x
运行脚本时,会出现此结果,进一步显示它在sudo taskset
行中死亡。它从start
命令中排除的事实令人困惑。
[[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
UPDATE: bash -x
揭示了问题:start
命令不被传递通过:在变量名一个错字产生无声的bash错误。外卖店:使用bash -x
进行调试!
我不这么认为......'cat'会,我相信''RESULT'读入'$ STATUS'。然后我检查'$ STATUS'是否为空。无论如何,问题出现在这一点之前。我把它包括在这里来展示我想要做的事情。 – 2013-02-14 22:48:35
我相信每个脚本都有返回状态,除非它仍在运行。你无法获得任何退货状态? – AlexLordThorsen 2013-02-14 23:22:59
尽管底层脚本应该只是将控制权交回,bash脚本似乎仍会继续运行。因此没有返回状态。 – 2013-02-14 23:50:34