Skip to main content
 首页 » 编程设计

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

2025年05月04日13Free-Thinker

我有一个调用 python 脚本 (MyDaemon.py) 的 bash 脚本 (Controller.sh)。后者接受一个参数和一个命令,并且可以像这样从命令行调用:

/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 脚本正确执行此命令?

后脚本:我有点困惑这个问题是如何“太具体”并且被否决/投票关闭。试图变得清晰;我试图了解 fork 进程脚本在命令行上下文中的运行方式与 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 进行调试!

请您参考如下方法:

因为你的错字 - 你应该在你的脚本的顶部使用 set -u,它是一个救命稻草,停止不眠之夜以及否定拉头发。

set -u 会给你...

myscript.sh: line 11: COMMMAND: unbound variable 

请记住,您可以像这样运行脚本