我有一个Controller.sh
调用 python 脚本 () 的 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
在线上死掉了。它离开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
用于调试!