我正在尝试通过 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”。