【问题标题】:How to run python program as a daemon?如何将python程序作为守护进程运行?
【发布时间】:2013-09-14 04:23:03
【问题描述】:

我编写了以下程序以将我的程序作为守护程序运行,但它没有运行;当我从 python 调试器运行程序时,它可以工作。

我正在使用 Mac os x。

/User/Library/LaunchDaemons/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/vivekbhintade/Desktop/test.py</string>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>

/Users/vivekbhintade/Desktop/test.py:

import urllib2
from datetime import datetime
import smtplib
from smtplib import SMTPException
import threading

def checkerror():

    #my code which works fine individually, which sends mail after 5 seconds to recipients.

checkerror()

我还使用以下命令从终端运行程序。

launchctl load /Library/LaunchDaemons/com.bobbob.osx.test.plist 

这不会导致任何错误。

【问题讨论】:

  • launchctl load /Library/LaunchDaemons/com.bobbob.osx.test.plist 工作吗?
  • 是的,它工作意味着它不会给出任何类型的错误消息
  • 但是launchctl 也会发送您期望的电子邮件吗?你如何从终端运行它?与$ python test.py?在我看来,您的文件开头缺少#!/bin/env python,因此操作系统不知道如何运行它。

标签: python macos python-2.7


【解决方案1】:

您几乎可以肯定在发布后的 3 个月内意识到了这一点,但在 Launch DaemonsLaunch Agents 之间似乎有些混淆,我认为它会值得澄清 - 特别是因为代理通常被称为守护进程。

转述Apple Developer library:

  • 守护程序在启动时以 root 身份运行,无法呈现 UI 元素,并且位于 /Library/LaunchDaemons/
  • 代理在登录时在用户上下文中运行,并且能够向用户呈现 UI 元素。这些位于/Users/username/Library/LaunchAgents/

您的程序无法运行,因为它位于/User/Library - 它需要进入上述路径中的一个或另一个,这取决于您计划如何使用它。

【讨论】:

    【解决方案2】:

    你试过launchctl吗?

    我相信这个堆栈回答了你的问题:

    Running Python in background on OS X

    【讨论】:

      最近更新 更多