有没有办法让我的Python脚本(带有无限的'while'循环)在OS X的后台运行?另外,出于同样的目的,有没有办法在USB驱动器上安装“自动运行”python脚本?
答案 0 :(得分:33)
如果您希望脚本作为自动启动的守护进程运行,您可以使用launchctl和plist文件。
例如,Bob有一个简单的python脚本,它在主目录中每秒都会将一个单词'foo'写入文件:
#!/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
这将加载该脚本并立即在<string>
下面的<key>Program</key>
元素中运行该程序。您还可以使用具有<ProgramArguments>
元素数组的<string>
节点为程序指定参数。有关详细信息,请参阅launchd.plist man page
如果要删除脚本,可以使用launchctl
的卸载命令:
launchctl unload ~/Library/LaunchAgents/com.bobbob.osx.test.plist
脚本中使用的标签可以是任何内容,但它在您的系统上应该是唯一的,因此Apple通常使用反向域名。
至于自动编写脚本,我认为没有办法做到这一点。
答案 1 :(得分:2)
有关在Unix系统上守护python脚本的方法,请参阅此问题: Python Daemon Packaging Best Practices
当然,如果你需要,你可以随时在后台运行脚本。
答案 2 :(得分:1)
只需使用shell以常规方式在后台运行Python脚本:
python myscript.py &
至于自动运行问题,如果它是Mac OS X默认执行的操作,这将是一个巨大的安全漏洞,所以,当然不是。但是你可以轻松编写一个脚本来实现这样的目的:定期查找插入的USB驱动器,并在插入时执行某些操作(甚至从拇指驱动器运行第二个脚本)。
答案 3 :(得分:1)
我尝试了launchctl
并且无法让它在El Capitan中运行并且再搜索一下并找到了post
<强> TL; DR 强>
在脚本上使用shebang line #!/usr/bin/env python
或#!/path/to/python
chmod +x test.py
nohup /path/to/test.py &
ps ax | grep test.py
答案 4 :(得分:0)
你可以使用nohup https://linux.die.net/man/1/nohup
$ nohup python <your_script.py> &
这将运行您的进程并将输出附加到同一目录中的文件nohup.out。 &安培;将按照其他答案的说明在后台运行脚本。