![](/img/trans.png)
[英]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.