我有一個調用python腳本(MyDaemon.py
)的bash腳本(Controller.sh
)。後者需要一個參數和命令,可以通過命令行來調用,像這樣:從調用python腳本的bash腳本返回
/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
不返回一個狀態。在另一方面,如果我運行下面的它返回:
[[email protected]]# 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
[[email protected]]#
我不得不得出結論,有一些事是防止它返回bash腳本。
需要注意的是MyDaemon.py
沒有fork過程,這就是爲什麼我需要重定向輸出。還應該注意的是,我將其中的大部分內容從另一個腳本中解放出來,這些腳本與php腳本類似;一些我很模糊的含義(如STATUS=$?
)。也就是說,即使我在sudo taskset
調用行後刪除了所有內容,它仍然無法清晰地返回。如何獲得bash腳本以正確執行此命令?
Post-Script:我對這個問題是如何「太具體」並且被低估/投票結束感到有點困惑。試圖澄清;我試圖理解在命令行和bash腳本的上下文中分叉進程腳本的差異。我已經提供了一個特定的例子,但這是一個普遍的概念。
更新: 當我使用bash -x
運行腳本時,會出現此結果,進一步顯示它在sudo taskset
行中死亡。它從start
命令中排除的事實令人困惑。
[[email protected]]# 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
UPDATE: bash -x
揭示了問題:start
命令不被傳遞通過:在變量名一個錯字產生無聲的bash錯誤。外賣店:使用bash -x
進行調試!
我不這麼認爲......'cat'會,我相信''RESULT'讀入'$ STATUS'。然後我檢查'$ STATUS'是否爲空。無論如何,問題出現在這一點之前。我把它包括在這裏來展示我想要做的事情。 – 2013-02-14 22:48:35
我相信每個腳本都有返回狀態,除非它仍在運行。你無法獲得任何退貨狀態? – AlexLordThorsen 2013-02-14 23:22:59
儘管底層腳本應該只是將控制權交回,bash腳本似乎仍會繼續運行。因此沒有返回狀態。 – 2013-02-14 23:50:34