我正在尝试编写一个 upstart 脚本,通过 ping 它的 HTTP 接口来检查我的进程是否正在运行。到目前为止,我就是无法让该post-start
子句起作用。这是我尝试过的简化版本:
description "my application"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
respawn limit 360 180
setuid myuser
setgid mygroup
chdir /my/directory
exec /bin/sleep 60
post-start script
sleep 5
stop
exit 1
end script
从终端:
/etc/init$ sudo start myapp # returns after 5 seconds
myapp start/running, process 27477
jrantil@myserver:/etc/init$ ps -ef|grep sleep
107 27477 1 0 16:56 ? 00:00:00 /bin/sleep 60
jrantil 27482 26900 0 16:56 pts/1 00:00:00 grep --color=auto sleep
有人能告诉我为什么我的应用程序 5 秒后没有关闭吗?据我所知,如果我不调用stop
它,它就会重新生成。
答案1
你可能想让这成为一个任务脚本,而不是服务脚本。这意味着 Upstart init 守护进程不会期望它继续运行,也不会尝试重新启动它或跟踪 PID。将stop
、exec
和post-start
节替换为task
指令,保留如下内容:
描述“我的申请” 在运行级别启动 [2345] 任务 设置我的用户 设置我的组 chdir /我的/目录 执行/bin/sleep 5
显然,exec
用对你有意义的东西替换该行。也许你想script
连续运行几个命令。如果你的进程永远不会自行停止,并且你希望 Upstart 在 5 秒后将其终止,请尝试以下操作:
描述“我的申请” 在运行级别启动 [2345] 请停止杀我 设置我的用户 设置我的组 chdir /我的/目录 执行/bin/sleep 60 启动后脚本 /bin/sleep 5 initctl 发出 kill-me-please 结束脚本