2

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

4

1 回答 1

1

由于您的拼写错误-您应该set -u在脚本的顶部使用它,它可以挽救生命,并且可以避免不眠之夜以及消除头发的拉扯。

set -u会给你...

myscript.sh: line 11: COMMMAND: unbound variable

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

于 2013-02-15T10:49:47.327 回答