2013-02-14 64 views
2

我有一个调用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进行调试!

+0

我不这么认为......'cat'会,我相信''RESULT'读入'$ STATUS'。然后我检查'$ STATUS'是否为空。无论如何,问题出现在这一点之前。我把它包括在这里来展示我想要做的事情。 – 2013-02-14 22:48:35

+0

我相信每个脚本都有返回状态,除非它仍在运行。你无法获得任何退货状态? – AlexLordThorsen 2013-02-14 23:22:59

+0

尽管底层脚本应该只是将控制权交回,bash脚本似乎仍会继续运行。因此没有返回状态。 – 2013-02-14 23:50:34

回答

1

由于您的排字错误 - 您应该在脚本的顶部使用set -u,这是一种挽救生命的功能,可以避免不眠之夜以及否定拉动头发。

set -u会给你...

myscript.sh: line 11: COMMMAND: unbound variable 

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