我有一个调用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 -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
进行调试!
答案 0 :(得分:1)
由于你的拼写错误 - 你应该在脚本的顶部使用set -u
,这是一个救生员,可以避免不眠之夜以及消除头发的拉扯。
set -u
会给你......
myscript.sh: line 11: COMMMAND: unbound variable
请记住,您可以像bash -u myscript.sh arg1 arg2
一样运行-x
这样的脚本,它们都可以帮助它跟踪脚本问题。