2012-03-01 71 views
11

有什麼辦法讓我的Python腳本(帶有無盡的'while'循環)在OS X的後臺運行?另外,出於同樣的目的,有沒有辦法在USB驅動器上「自動運行」python腳本?在OS X的後臺運行Python

+0

我相信'屏幕'應該沒問題的第一部分 – Robus 2012-03-01 19:10:22

回答

29

如果您想讓腳本作爲自動啓動的守護進程運行,您可以使用launchctl和plist文件。

例如,Bob有一個簡單的Python腳本,這個詞「富」寫入文件,在他的家目錄每秒:

#!/usr/bin/env python 
import os 
import time 

while True: 
    os.system('echo " foo" >> /Users/bob/foostore.txt') 
    time.sleep(1) 

有它運行的守護進程,創建一個plist文件,~/Library/LaunchAgents/com.bobbob.osx.test.plist,與內容:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd > 
<plist version="1.0"> 
    <dict> 
    <key>Label</key> 
    <string>com.bobbob.osx.test</string> 
    <key>Program</key> 
    <string>/Users/bob/pyfoo.py</string> 
    <key>KeepAlive</key> 
    <true/> 
    </dict> 
</plist> 

然後使用launchctl從終端裝載的plist:

launchctl load ~/Library/LaunchAgents/com.bobbob.osx.test.plist 

這將加載該腳本,並立即在<key>Program</key>下的<string>元素中運行該程序。您還可以使用具有<string>元素的數組的<ProgramArguments>節點爲程序指定參數。欲瞭解更多信息,請參閱launchd.plist man page

如果你想刪除腳本,您可以使用launchctl卸載命令:

launchctl unload ~/Library/LaunchAgents/com.bobbob.osx.test.plist 

在腳本中使用的標籤可以是任何東西,但它應該是唯一的你的系統,所以蘋果通常使用反向域名。

至於自動運行腳本,我不認爲有任何方法可以做到這一點。

1

只需在後臺使用外殼以通常的方式運行Python腳本:

python myscript.py & 

至於自動運行的問題,這將是一個巨大的安全漏洞,如果那件事,Mac OS X中沒有通過默認,所以,不,當然不是。但是您可以輕鬆地編寫一個實現類似目的的腳本:定期查找插入的USB驅動器,並在插入時執行某些操作(即使是從拇指驅動器運行第二個腳本)。

+0

但是,當shell關閉時,這不會繼續運行嗎? – tkbx 2012-03-01 19:26:57

+0

是的,你說得對。我從來沒有關閉我的貝殼,所以我沒有考慮到這一點。更好的選項可能是啓動腳本的AppleScript小程序。 – kindall 2012-03-01 19:36:04

0

我試圖launchctl,不能讓它在埃爾卡皮坦工作,並搜查一點各地越來越發現這個post

TL;你的腳本DR

使用家當線#!/usr/bin/env python#!/path/to/python

chmod +x test.py 
nohup /path/to/test.py & 
ps ax | grep test.py 
0

您可以使用nohup https://linux.die.net/man/1/nohup

$ nohup python <your_script.py> & 

這將運行您的進程並將輸出追加到同一目錄中的文件nohup.out。 &將按照其他答案的說明在後臺運行該腳本。