Я хочу автоматически загружать и запускать программу Lisp в CCL в фоновом режиме при загрузке моего Mac (OS 10.9). У меня есть список запуска, который я сохранил в / Library / LaunchDaemons,
<?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
из терминала я вижу вверху, что 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 показывает, что процесс завершился, а последующий icecreamcomputer.log не показал активности, пока я загружал plist демона.
Похоже, ваше LISP-программирование нарушает требования демона launchd:
"Вы не должны демонизировать свой процесс. Это включает вызов функции демона, вызов fork с последующим exec или вызов fork с последующим exit. Если вы это сделаете, launchd думает, что ваш процесс умер. В зависимости от настроек ключа вашего списка свойств, launchd либо продолжайте пытаться перезапустить свой процесс, пока он не прекратит работу (с сообщением об ошибке «слишком быстро возрождается») или не сможет перезапустить его, если он действительно умрет ».
Чтобы лучше понять launchd - особенно для синтаксиса plist - я рекомендую написать сценарий hello world с бесконечным циклом, используя команду logger (1) для записи в sylog каждые ~ 5 секунд. Заставьте скрипт работать на переднем и заднем планах, чтобы увидеть разницу. Кроме того, используйте plutil (1) для двойной проверки на наличие легко упускаемых из виду синтаксических ошибок.
Запущенные вакансии Apple в / System / Library / LaunchDaemons также являются отличным справочником. Обратите внимание, что в частности apache one, который использует:
/ usr / sbin / httpd -D строка> FOREGROUND
Чтобы выполнить требование демона launchd.
Удачи!