2016-08-20 55 views
2

讓我們假設我有多個文件路徑,從終端, 來看,我希望他們能夠在後臺並行而不輸出其輸出到控制檯屏幕上運行。 (它們的輸出應該保存到python文件本身定義的其他日誌路徑中)。運行從平行的bash多個腳本,而不進行打印輸出到控制檯

的路徑是這種格式:

/home/Dan/workers/1/run.py 
/home/Dan/workers/2/run.py etc. 

當我嘗試做這樣的事情在後臺運行一個工人似乎工作:
在例如:cd /home/Dan/workers/1/python run.py > /dev/null 2>&1 &

而且ps -ef |grep python ,確實顯示腳本在後臺運行而不打印到控制檯,但打印到其預定義的日誌路徑。

#!/bin/bash 
for path in /home/Dan/workers/* 
do 
if [-f path/run.py ] 
then 
    python run.py > /dev/null 2>&1 & 
fi 
done 

任何想法有什麼不同:

然而,當我嘗試通過bash腳本發動他們,我沒有Python腳本下面的代碼後運行? 在bash腳本中,我嘗試一個接一個地啓動許多腳本,就像我只爲一個腳本所做的那樣。

+0

請看看[編輯的幫助(HTTP: //stackoverflow.com/editing-help)。用四個空格前綴代碼行。 – Cyrus

+0

這應該起作用了(假設'fi'後面有'done',反正;如果那不在那裏,你應該得到一個錯誤信息)。請在'done'之後加上'wait',如果它不在那裏,然後發佈'bash -x yourscript'的輸出。 – zwol

+0

@zwol:那裏已經有'done'了,我忘了把它放在這裏,但是我不明白你關於'bash -x yourscript'的注意事項,請你詳細解釋我不熟悉bash – JavaSa

回答

3
#!/bin/bash 
for path in /home/Dan/workers/* 
do   # VV V-added ${} 
    if [ -f "${path}/run.py" ] 
    then 
     python "${path}/run.py" > /dev/null 2>&1 & 
     # or (cd $path; python run.py > /dev/null 2>&1 &) like Terje said 
    fi 
done 
wait 

使用${path}而不是僅僅pathpath是變量的名字,但你想,當你正在測試的文件是什麼存儲在path。爲了得到它,以$爲前綴。請注意,$path也適用於大多數情況,但如果您使用${path},您將更清楚您的意思。特別是在學習bash時,我建議堅持使用${...}表單。

編輯:將整個名稱放在雙引號中,以防${path}包含任何空格。

1

的一個重要區別是,你的bash腳本沒有cd到子目錄調用run.py
前的倒數第二行應該是

python ${path}/run.py > /dev/null 2>&1 & 

(cd $path; python run.py > /dev/null 2>&1 &) 
2
#!/bin/bash 

有對於這個劇本來說並不是什麼特別的東西;改爲寫#! /bin/sh。 (不要編寫bash特有的腳本;如果bash特有的功能似乎是解決問題最簡單的方法,那麼您應該用改善的編程語言來改寫整個系統)

for path in /home/Dan/workers/* 
do 

這一點是正確的。

if [-f path/run.py ] 

...但是這是錯誤的。 Shell變量不像Python中的變量。爲了使用(行話術語是「擴大」),你有一個shell變量把一個$在它的前面。此外,您需要在包含要擴展的shell變量的整個「單詞」周圍放置雙引號,否則將發生「不合要求」的「分詞」。 (有些情況下你想要分詞,然後你留下雙引號,但只有當你知道要分詞時。)另外,在[-f之間需要有一個空格。把它放在一起,這條線應該是

if [ -f "$path/run.py" ] 

then 
    python run.py > /dev/null 2>&1 & 
    fi 

該行的run.py也應該閱讀"$path/run.py"。這是可能的,這取決於每個python腳本做什麼,你不是想整行讀

(cd "$path" && exec python run.py > /dev/null 2>&1) & 

我不能說肯定不知道什麼是腳本做。

done 

應該有可能將這個讀取後另一條線路只是

wait 

,使得外部腳本不會終止,直到所有的工人來完成。

0

我會建議的是,不要通過循環調用。你的路徑表明你將擁有多個腳本。實際上,您所包含的循環語句會依次調用每個python腳本。它只有在第一個結束時纔會運行第二個。

更好地在上面添加

#!/bin/python在你的Python腳本(或任何安裝在你的Python路徑) 然後運行

/home/Dan/workers/1/run.py && /home/Dan/workers/2/run.py > /dev/null 2>&1 & 
相關問題