Upstart 不启动 emacs --daemon

Upstart 不启动 emacs --daemon

我正在尝试通过 upstart 启动 emacs 守护进程。这是我的脚本

# 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

我该如何解决?

编辑:conf 文件的 v2(添加了 expect fork 并在我的帐户下运行 emacs)编辑:v3(更正为 expect daemon)

# 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

编辑:

经过一番挖掘,我发现 upstart 提供了一个名为 的工具initctl check-config,可以检查不可达的条件。

运行该工具后发现,我的 conf 文件缺少一个空格,runlevel[2345]如下所示runlevel [2345]。守护进程现在可以正确启动。

但是,当我运行 时sudo initctl stop emacs,它挂起了,并且 emacs 守护进程没有被终止。我在 dmesg 中只发现了这个

[ 4378.169249] init: emacs goal changed from start to stop

kill但是,如果我通过或终止 emacs 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

答案1

因为“emacs --daemon”与前台分离,所以您需要让 upstart 知道这一点;否则,当父 emacs 进程退出时,它会假定服务已终止,即使 emacs 仍在运行,服务也会处于停止状态。

为了让 upstart 知道需要跟踪哪个进程(并在停止服务时终止该进程),您需要在作业定义中添加“expect fork”。

相关内容