启动作业运行,但立即退出

我希望在Mac(OS 10.9)引导时自动在后台加载并运行CCL中的Lisp程序。 我有一个已经保存到/ Library / LaunchDaemons的启动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>sudo</string> <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> 

当我打电话

 launchctl load /Library/LaunchDaemons/com.icecreamcomputer.plist 

从terminal,我可以看到顶部dx86cl运行几秒钟,然后消失。 随后启动列出了已退出的工作。 但是,如果我打电话

 sudo /Applications/ccl/./dx86cl -l /Users/frank/Documents/Lisp/ice-cream-computer/ice-cream-computer.lisp 

从terminal,我的程序启动并保持运行没有问题。 什么可能导致我的启动工作在开始后立即退出?

以下是来自/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加载时通常打印到stdout的内容。 它所缺less的是loggingHTTP服务器活动,如接收和履行请求。

 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,它继续其节streamrespawns周期,并说即使我调用launchctl卸载/Library/LaunchDaemons/com.icecreamcomputer.plist它没有写入其日志。 它只在服务器重启时停止循环。 是什么赋予了?

重新启动后,我试图再次加载守护进程。 没有错误消息,但是launchctl列表显示进程已经退出,而加载守护进程的plist时,拖尾icecreamcomputer.log显示没有活动。

听起来你的LISP编程违反了launchd的守护进程要求:

“你不能守护你的进程,这包括调用守护进程函数,调用fork然后执行exec,或者调用fork然后退出。如果你这样做,launchd认为你的进程已经死了。根据你的属性列表的关键设置,launchd将会不断尝试重新启动你的进程,直到它放弃(“重新生成太快”的错误信息),否则将无法重新启动它,如果它真的死了。

来源: https : //developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html

要理解launchd更好 – 特别是plist语法 – 我build议使用logger(1)命令写一个hello世界脚本,并使用无限循环向sylog写入5秒钟。 使脚本在前台和后台工作,看看有什么不同。 另外,使用plutil(1)仔细检查容易被忽略的语法错误。

苹果在/ System / Library / LaunchDaemons中启动的工作也是一个很好的参考。 请注意,特别是apache,它使用:

/ usr / sbin / httpd -D string> FOREGROUND

解决launchd的守护进程的需求。

祝你好运!