Macos 启动的作业运行,但随后立即退出

Macos 启动的作业运行,但随后立即退出,macos,launchd,Macos,Launchd,我希望在Mac(OS 10.9)启动时,在后台自动加载并运行CCL中的Lisp程序。我有一个已保存到/Library/LaunchDaemons的launchd 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">

我希望在Mac(OS 10.9)启动时,在后台自动加载并运行CCL中的Lisp程序。我有一个已保存到/Library/LaunchDaemons的launchd 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.icecreamcomputer</string>
    <key>ProgramArguments</key>
    <array>
            <string>/Applications/ccl/./dx86cl</string>
            <string>-l</string>
            <string>/Users/frank/Documents/Lisp/ice-cream-computer/ice-cream-computer.lisp</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>
从终端,我可以在顶部看到dx86cl运行了几秒钟,然后消失了。之后launchd将作业列为已退出。然而,如果我打电话

sudo /Applications/ccl/./dx86cl -l /Users/frank/Documents/Lisp/ice-cream-computer/ice-cream-computer.lisp
从终端,我的程序启动并保持运行,没有问题。是什么原因导致我刚开始的工作在开始后立即辞职

以下是/var/log/system.log中的条目:

Apr 15 10:01:55 frynseytv.icecreamcomputer.com sudo[34963]:     root : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/Applications/ccl/./dx86cl -l /Users/frank/Documents/Lisp/ice-cream-computer/ice-cream-computer.lisp
Apr 15 10:01:58 frynseytv com.apple.launchd[1] (com.icecreamcomputer): Throttling respawn: Will start in 8 seconds
Apr 15 10:02:00 frynseytv com.apple.launchd.peruser.501[306] (com.icecreamcomputer[34965]): open("/var/log/icecreamcomputer.log", ...): 13: Permission denied
Apr 15 10:02:02 frynseytv com.apple.launchd.peruser.501[306] (com.icecreamcomputer): Throttling respawn: Will start in 8 seconds
显然,它没有权限打开名为“/var/log/icecreamcomputer.log”的日志,而且实际上不存在这样的文件或目录。虽然这看起来很奇怪,因为root/wheel拥有/var/log/icecreamcomputer.log,root运行launchd,其他进程启动launchd,不是吗?下面是/var/log/icecreamcomputer.log的摘录。它显示加载icecreamcomputer.lisp时通常打印到标准输出的内容。它缺少的是记录的http服务器活动,如接收和完成请求

Welcome to Clozure Common Lisp Version 1.9-r15759  (DarwinX8664)!
? 
==== quicklisp quickstart loaded ====

To continue with installation, evaluate: (quicklisp-quickstart:install)

For installation options, evaluate: (quicklisp-quickstart:help)

To load "hunchentoot":
Load 1 ASDF system:
hunchentoot
; Loading "hunchentoot"
实际上,当我跟踪-f/var/log/icecreamcomputer.log时,它会继续它的节流循环,并说即使在我调用launchctl unload/Library/LaunchDaemons/com.icecreamcomputer.plist之后它也无法写入日志。它仅在服务器重新启动时停止循环。有什么好处


重启后,我尝试再次加载守护进程。没有错误消息,但launchctl列表显示进程已退出,并且在我加载守护进程的plist时,tailing icecreamcomputer.log未显示任何活动

使用
sudo
launchctl

sudo launchctl load /Library/LaunchDaemons/com.icecreamcomputer.plist  
这将修复被拒绝的权限错误:

Apr 15 10:02:00 frynseytv com.apple.launchd.peruser.501[306] (com.icecreamcomputer[34965]): open("/var/log/icecreamcomputer.log", ...): 13: Permission denied

可能是我的程序加载的一个库包做了launchd禁止的事情,比如分叉过程。我已经尝试过的简单的hello world程序运行良好。最终,我通过将程序移动到Raspbian Linux机器上并使用init脚本启动它,得到了我想要的结果。

尝试使用
sudo
加载
plist
时,它可能正在重新启动系统,因为当时它拥有root权限。这个命令应该是
sudo-launchctl-load/Library/LaunchDaemons/com.icecreamcomputer.plist
谢谢,但是我已经调用了sudo-I,所以我用来与launchctl交互的每个命令都应该经过sudo。另外,问题不在于将plist作为守护进程加载,而是在launchd稍后尝试执行守护进程时。
Apr 15 10:02:00 frynseytv com.apple.launchd.peruser.501[306] (com.icecreamcomputer[34965]): open("/var/log/icecreamcomputer.log", ...): 13: Permission denied