2015-04-30 40 views
0

我想運行腳本,如果尚未運行使用其他腳本。運行腳本,如果尚未運行 - 越來越[0:找不到

test $ ls 
arcane_script.py calling_script.sh 

這是我的腳本如下現在

test $ cat calling_script.sh 
#!/bin/bash 

PROCESSES_RUNNING=$(ps -ef | grep "arcane_script.py" | grep -v "grep" | wc -l) 
echo $PROCESSES_RUNNING 
if [$PROCESSES_RUNNING = "0"]; then 
    /usr/bin/python arcane_script.py 
fi; 

我試過的其他變體if塊內,類似於[$PROCESSES_RUNNING -eq 0],但它們都輸出相同的錯誤消息

test $ ./calling_script.sh 
0 
./calling_script.sh: line 5: [0: command not found 
test $ sh calling_script.sh 
0 
calling_script.sh: 5: calling_script.sh: [0: not found 

我在做什麼錯,我該如何解決?我搜索了一下,但無法找到很多幫助。

+1

不知道它是否有幫助,但我已經看到的ifs的所有例子都有大括號後面的空格,例如:if [condition]而不是:if [condition] –

+0

@BenjyKessler Spot on,that worked。將其作爲解答發佈,我會接受:) –

回答

2

在bash中,你需要用空格保護括號。括號只是test命令的簡寫。而在bash命令中必須用空格分隔。有關更多詳細信息,請參閱this link。所以你需要寫if [ condition ]而不是if [condition]

2

您需要周圍的支架空間:

[ $PROCESSES_RUNNING = "0" ] 

之所以是[實際上是命令的名稱,並在外殼的所有命令必須從換句話說用空格隔開。

1

更堅實的方法是使用pid文件。然後,如果pid文件存在,您知道它是一個正在運行的進程。 想法是在程序開始時將processID寫入文件(例如在/ tmp中),並在程序結束時將其刪除。另一個程序可以簡單地檢查pid文件是否存在。

在你的Python文件的開頭添加類似

#/usr/bin/env python 

import os 
import sys 

pid = str(os.getpid()) 
pidfile = "/tmp/arcane_script.pid" 

if os.path.isfile(pidfile): 
    print "%s already exists, exiting" % pidfile 
    sys.exit() 
else: 
    file(pidfile, 'w').write(pid) 

# Do some actual work here 


# 
os.unlink(pidfile) 

這種方式,你甚至都不需要額外的bash啓動腳本。 如果你想使用bash反正檢查,簡單地看爲PID:

cat /tmp/arcane_script.pid 2>/dev/null && echo "" || echo "Not running" 

注意該PID文件需要手動刪除,如果你的腳本沒有正確結束。

PS。如果您想自動檢查PID是否存在,請查看Monit。如果需要,它可以重新啓動程序。

+0

你能解釋一下嗎?另外,什麼是'$!'語法? –

+0

'$!'返回已啓動腳本的processID。但是,既然你使用Python,我編輯了答案。 – FeedTheWeb

+0

謝謝。我不打算通過文件來完成它,因爲如果某個進程因任何原因而刪除文件,那麼下一個任務將不會運行。無論如何,+1的答案。 –

相關問題