[英]cron invokes bash script which invokes “script” to run python program. Next line of bash script runs immediately, before script/python completes
[英]Returning from bash script that invokes a python script
我有一个bash脚本( Controller.sh
),它可以调用python脚本( 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
调用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
会分叉进程,这就是为什么我需要重定向输出。 还应该注意的是,我将大部分内容从另一个与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
进行调试!
由于您的错字-您应该在脚本的顶部使用set -u
,这可以节省生命,并且可以避免不眠之夜以及对头发的拉扯。
set -u
会给你...
myscript.sh: line 11: COMMMAND: unbound variable
记住,您可以像使用-x
一样运行类似bash -u myscript.sh arg1 arg2
类的脚本,它们都有助于跟踪脚本问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.