Я пытаюсь запустить демон emacs через upstart. Вот мой сценарий
# emacs --daemon - Emacs daemon
#
# The Emacs daemon provides a server for Emacs clients.
description "Emacs daemon"
start on runlevel[2345]
stop on runlevel[!2345]
respawn
respawn limit 10 5 # respawn up to 10 times, waiting 5 seconds each time
pre-start script
echo "Starting emacs daemon..." > /home/eric/Desktop/emacs.log
end script
pre-stop script
emacsclient -n -e '(save-persistent-scratch)'
end script
exec emacs --daemon
Я могу начать это через sudo initctl start emacs
просто отлично. Однако, это не выполняется во время запуска (или emacs --daemon умирает?). Вызов sudo initctl list
отображает задание как emacs stop/waiting
, что, очевидно, означает, что задание еще не было начато. Однако вызов runlevel
возвращает N 2
.
Как это исправить?
Редактировать: v2 файла conf (добавлен ожидаемый форк и запускать emacs под моей учетной записью) Редактировать: v3 (исправлено ожидать демона)
# emacs --daemon - Emacs daemon
#
# The Emacs daemon provides a server for Emacs clients.
description "Emacs daemon"
start on runlevel[2345]
stop on runlevel[!2345]
expect daemon
respawn
respawn limit 10 5 # respawn up to 10 times, waiting 5 seconds each time
pre-start script
echo "Starting emacs daemon..." > /home/eric/Desktop/emacs.log
end script
pre-stop script
emacsclient -n -e '(save-persistent-scratch)'
end script
exec start-stop-daemon --start --chuid eric --exec /usr/bin/emacs -- --daemon -u eric
Редактировать:
После копания я обнаружил, что выскочка предоставляет инструмент под названием initctl check-config
, который может проверять недоступные условия.
Запуск инструмента показал, что в моем файле conf отсутствовал пробел в runlevel[2345]
, например, runlevel [2345]
. Теперь демон запускается правильно.
Однако, когда я запускаю sudo initctl stop emacs
, он зависает, и демон emacs не убивается. Я нахожу в dmesg это и только это
[ 4378.169249] init: emacs goal changed from start to stop
Но, если я убью emacs через kill
или emacsclient -n -e '(kill-emacs)'
, это появится в dmesg
[ 4378.169286] init: emacs state changed from spawned to stopping
[ 4378.169314] init: event_new: Pending stopping event
[ 4378.169325] init: Handling stopping event
[ 4378.169392] init: event_finished: Finished stopping event
[ 4378.169399] init: emacs state changed from stopping to killed
[ 4378.169431] init: emacs state changed from killed to post-stop
[ 4378.169450] init: emacs state changed from post-stop to waiting
[ 4378.169473] init: event_new: Pending stopped event
[ 4378.169484] init: job_change_state: Destroyed inactive instance emacs
[ 4378.169542] init: Handling stopped event
[ 4378.169594] init: event_finished: Finished stopped event
Теперь возникает вопрос: почему initctl stop emacs
не работает?
Поскольку 'emacs --daemon' отрывается от переднего плана, вам нужно дать знать выскочке, чтобы ожидать этого; в противном случае, когда родительский процесс emacs завершает работу, он предполагает, что служба завершена, и служба остается в остановленном состоянии, даже если emacs все еще работает.
Чтобы дать знать upstart, какой процесс нужно отследить (и убить при остановке службы), вам нужно добавить «ожидание форка» в определение задания.