2013-02-14 59 views
2

我有一個調用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進行調試!

+0

我不這麼認爲......'cat'會,我相信''RESULT'讀入'$ STATUS'。然後我檢查'$ STATUS'是否爲空。無論如何,問題出現在這一點之前。我把它包括在這裏來展示我想要做的事情。 – 2013-02-14 22:48:35

+0

我相信每個腳本都有返回狀態,除非它仍在運行。你無法獲得任何退貨狀態? – AlexLordThorsen 2013-02-14 23:22:59

+0

儘管底層腳本應該只是將控制權交回,bash腳本似乎仍會繼續運行。因此沒有返回狀態。 – 2013-02-14 23:50:34

回答

1

由於您的排字錯誤 - 您應該在腳本的頂部使用set -u,這是一種挽救生命的功能,可以避免不眠之夜以及否定拉動頭髮。

set -u會給你...

myscript.sh: line 11: COMMMAND: unbound variable 

記住,你可以像這樣bash -u myscript.sh arg1 arg2運行腳本同樣與-x,他們都幫助它跟蹤腳本的問題。