2012-03-01 41 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。 &将按照其他答案的说明在后台运行该脚本。