从调用python脚本的bash脚本返回

时间:2013-02-14 22:44:53

标签: python bash

我有一个调用python脚本(Controller.sh)的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脚本的运行方式之间的差异。我在上面提供了一个具体的例子,但这是一个普遍的概念。

更新: 当我使用bash -x运行脚本时,结果会显示它在sudo taskset行上死亡。 <{1}}命令之外的事实令人困惑。

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命令未被传递:变量名中的拼写错误产生静默bash错误。摘要:使用start进行调试!

1 个答案:

答案 0 :(得分:1)

由于你的拼写错误 - 你应该在脚本的顶部使用set -u,这是一个救生员,可以避免不眠之夜以及消除头发的拉扯。

set -u会给你......

myscript.sh: line 11: COMMMAND: unbound variable

请记住,您可以像bash -u myscript.sh arg1 arg2一样运行-x这样的脚本,它们都可以帮助它跟踪脚本问题。