【问题标题】:Running Python in background on OS X在 OS X 上后台运行 Python
【发布时间】:2012-03-20 07:24:20
【问题描述】:

有没有办法让我的 Python 脚本(带有无限的“while”循环)在 OS X 的后台运行?另外,出于同样的目的,有没有办法在 USB 驱动器上“自动运行”python 脚本?

【问题讨论】:

  • 我相信screen 对于问题的第一部分应该没问题

标签: python macos daemon


【解决方案1】:

如果你想让脚本作为一个自动启动的守护进程运行,你可以使用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

这将加载该脚本并立即在&lt;key&gt;Program&lt;/key&gt; 下的&lt;string&gt; 元素中运行程序。您还可以使用带有&lt;string&gt; 元素数组的&lt;ProgramArguments&gt; 节点为程序指定参数。欲了解更多信息,请参阅launchd.plist man page

如果要删除脚本,可以使用launchctl的卸载命令:

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

脚本中使用的 Label 可以是任何东西,但它在您的系统上应该是唯一的,因此 Apple 通常使用反向域名。

至于自动运行脚本,我认为没有办法做到这一点。

【讨论】:

    【解决方案2】:

    我尝试了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
    

    【讨论】:

      【解决方案3】:

      有关在类 Unix 系统上守护 Python 脚本的方法,请参阅此问题: Python Daemon Packaging Best Practices

      当然,如果您只需要这样,您可以随时在后台运行脚本,如 kindall 所述。

      【讨论】:

        【解决方案4】:

        只需以通常的方式使用 shell 在后台运行您的 Python 脚本:

        python myscript.py &
        

        至于自动运行问题,如果这是 Mac OS X 默认执行的操作,这将是一个巨大的安全漏洞,所以,不,当然不是。但是你可以很容易地编写一个脚本来实现类似的东西:定期寻找插入的 USB 驱动器,并在插入时执行某些操作(甚至从拇指驱动器运行第二个脚本)。

        【讨论】:

        • 但是当 shell 关闭时,它不会继续运行,不是吗?
        • 是的,你是对的。我从不关闭我的贝壳,所以我没有考虑到这一点。更好的选择可能是启动脚本的 AppleScript 小程序。
        【解决方案5】:

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

        $ nohup python <your_script.py> &
        

        这将运行您的进程并将输出附加到同一目录中的文件 nohup.out 中。 & 将按照其他答案的说明在后台运行脚本。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-06-07
          • 1970-01-01
          • 2012-10-07
          • 1970-01-01
          • 1970-01-01
          • 2011-08-05
          • 1970-01-01
          相关资源
          最近更新 更多