OS X上的Pylons:如何正确设置launchd plist以启动并保持Pylons服务器?

2 投票
2 回答
1362 浏览
提问于 2025-04-16 15:37

更新:问题只是因为在Pylons应用中出现了导入错误(因为在运行launchd任务时,$PYTHONPATH是不同的),这导致了失败后重启的循环。非常感谢那些建议我查看日志的人。

大家好,

我在使用OS X,想设置一个launchd任务来启动并保持我的pylons应用运行。

我像往常一样加载这个任务:

sudo launchctl unload /Library/LaunchDaemons/dvlf.plist

在终端中没有看到错误信息。服务器始终无法启动。相反,我在控制台上看到的是:

4/12/11 6:23:57 PM  com.apple.launchd[1]    (com.dvlf.pylons) Throttling respawn: Will start in 9 seconds

这是我的.plist文件。任何建议都非常感谢!

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Disabled</key>
    <false/>
    <key>KeepAlive</key>
    <true/>
    <key>Label</key>
    <string>com.dvlf.pylons</string>
    <key>EnvironmentVariables</key>
        <dict>
                <key>PYTHON_EGG_CACHE</key>
                <string>/tmp/.python-eggs</string>
        </dict>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/paster</string>
        <string>serve</string>
        <string>--reload</string>
        <string>/Volumes/w/artfl/projects/dodgr/servers/pylons/DODGR/production.ini</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>Umask</key>
    <integer>7</integer>
    <key>UserName</key>
    <string>_www</string>
    <key>WorkingDirectory</key>
    <string>/Volumes/w/artfl/projects/dodgr/servers/pylons/DODGR/</string>
    <key>StandardErrorPath</key>
    <string>/var/log/dvlf_paster_error.log</string>
    <key>StandardOutPath</key>
    <string>/var/log/dvlf_output.log</string>
</dict>
</plist>

2 个回答

1

重启消息通常是因为程序在启动后不久就崩溃了,这可能是因为配置有问题。所以,先检查一下你的日志文件。

根据plist文件:你真的有这些目录或文件吗?(检查一下plist里的所有路径 - 这是最常见的错误)

/Volumes/w/artfl/projects/dodgr/servers/pylons/DODGR/production.ini
/Volumes/w/artfl/projects/dodgr/servers/pylons/DODGR/

如果没有,你需要重新编辑你的plist文件。

2

当我在SysV初始化系统中看到“重启太快”的问题时(比如在/etc/inittab文件里),通常是因为相关的程序使用了传统的“双重分叉然后执行”的方法来变成守护进程。很多这样的程序(比如sshdsyslogd)支持一些命令行选项(例如sshd的-D选项),可以让它们不去执行fork()

问题在于init(还有可能是launchd)在监控这个进程,以便在它退出时重新启动它。当程序试图将自己放到后台(也就是与父进程、进程组和所有相关的信号处理断开连接)时,这会被检测为几乎立即退出,这就需要重新启动。inittab(同样,可能还有launchd)会限制重启的频率,以防止一个失败的程序让系统过于繁忙。

解决这个问题的方法是看看能否配置这个dvlfs.pylons程序,让它在前台运行,或者使用“不要分离”或“不要变成守护进程”等类似的术语。

撰写回答