Upstart не запускается emacs --daemon

Я пытаюсь запустить демон 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 не работает?

2
задан 13.04.2020, 21:37

1 ответ

Поскольку 'emacs --daemon' отрывается от переднего плана, вам нужно дать знать выскочке, чтобы ожидать этого; в противном случае, когда родительский процесс emacs завершает работу, он предполагает, что служба завершена, и служба остается в остановленном состоянии, даже если emacs все еще работает.

Чтобы дать знать upstart, какой процесс нужно отследить (и убить при остановке службы), вам нужно добавить «ожидание форка» в определение задания.

0
ответ дан 13.04.2020, 21:37
  • 1
    expect fork ожидает, что программа разветвится однажды , в то время как expect daemon ожидает, что он разветвится дважды . См. этот раздел из Новомодной Поваренной книги для диаграммы на том, какой проступок может произойти, если Вы говорите Выскочке ожидать неправильное количество ветвлений. Как в той диаграмме говорится, если Вы будете использовать expect daemon, когда у Вас будет только одно ветвление, сценарий зависнет, который является поведением you' наблюдение ре. – eagle.dan.1349 13.04.2020, 21:38
  • 2
    Я имею, ожидают демона в conf файле, который делает эффективно то же самое, как ожидают ветвление – Marcus Riemer 13.04.2020, 21:38

Теги

Похожие вопросы