【发布时间】:2012-03-20 07:24:20
【问题描述】:
有没有办法让我的 Python 脚本(带有无限的“while”循环)在 OS X 的后台运行?另外,出于同样的目的,有没有办法在 USB 驱动器上“自动运行”python 脚本?
【问题讨论】:
-
我相信
screen对于问题的第一部分应该没问题
有没有办法让我的 Python 脚本(带有无限的“while”循环)在 OS X 的后台运行?另外,出于同样的目的,有没有办法在 USB 驱动器上“自动运行”python 脚本?
【问题讨论】:
screen 对于问题的第一部分应该没问题
如果你想让脚本作为一个自动启动的守护进程运行,你可以使用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
这将加载该脚本并立即在<key>Program</key> 下的<string> 元素中运行程序。您还可以使用带有<string> 元素数组的<ProgramArguments> 节点为程序指定参数。欲了解更多信息,请参阅launchd.plist man page
如果要删除脚本,可以使用launchctl的卸载命令:
launchctl unload ~/Library/LaunchAgents/com.bobbob.osx.test.plist
脚本中使用的 Label 可以是任何东西,但它在您的系统上应该是唯一的,因此 Apple 通常使用反向域名。
至于自动运行脚本,我认为没有办法做到这一点。
【讨论】:
我尝试了launchctl,但无法在 El Capitan 中使用,然后搜索了一下,发现了这个post
TL;DR
在脚本中使用 shebang 行 #!/usr/bin/env python 或 #!/path/to/python
chmod +x test.py
nohup /path/to/test.py &
ps ax | grep test.py
【讨论】:
有关在类 Unix 系统上守护 Python 脚本的方法,请参阅此问题: Python Daemon Packaging Best Practices
当然,如果您只需要这样,您可以随时在后台运行脚本,如 kindall 所述。
【讨论】:
只需以通常的方式使用 shell 在后台运行您的 Python 脚本:
python myscript.py &
至于自动运行问题,如果这是 Mac OS X 默认执行的操作,这将是一个巨大的安全漏洞,所以,不,当然不是。但是你可以很容易地编写一个脚本来实现类似的东西:定期寻找插入的 USB 驱动器,并在插入时执行某些操作(甚至从拇指驱动器运行第二个脚本)。
【讨论】:
你可以使用 nohup https://linux.die.net/man/1/nohup
$ nohup python <your_script.py> &
这将运行您的进程并将输出附加到同一目录中的文件 nohup.out 中。 & 将按照其他答案的说明在后台运行脚本。
【讨论】: