我有一台 Ubuntu 12.04 机器,其中运行着 C++ 应用服务器,并通过 upstart 脚本进行控制。这意味着每当我的应用服务器崩溃时,我的 upstart 脚本都会自动重新启动它们,每当我的 ubuntu 机器重新启动/重启时,我的 upstart 脚本都会再次重新启动我的应用服务器。
以下是我的 upstart 脚本:
start on runlevel [2345]
stop on runlevel [016]
chdir /opt/process/process_server
respawn
post-start script
echo "App server started at `date +"%F %T"` on `hostname -f`" | mailx -r "[email protected]" -s "Process Started" "[email protected]"
end script
post-stop script
sleep 30
end script
limit core unlimited unlimited
limit nofile 8092 8092
setuid caprti
exec ./process_server --config_file=../config/process.init
现在奇怪的是,我至少见过两次这种情况 - 我的 ubuntu 机器重新启动了,我不知道是怎么做的,是谁做的,但我的应用服务器根本没有重新启动,我不知道为什么?我自己已经多次测试过,通过键入重新启动同一个框"sudo reboot"
,每当那台机器重新启动时,我都会看到我的应用服务器自动重新启动。
在什么情况下,在重新启动 Ubuntu 机器时不会导致我的应用服务器从上面的 upstart 脚本重新启动?我的 Upstart 脚本中缺少什么吗?
此外,如果这两次都发生这种情况,我该如何验证我的 Upstart 脚本是否在上次重启期间尝试重新启动我的应用服务器,但由于某种原因失败了?
答案1
我有一些可能有帮助的注释或提示:
respawn
没有明确指定限制的节有默认值。6.28 重生
还要注意,如果作业没有指定
respawn limit
节以及respawn
节,则作业将应用默认的重生限制(参见respawn limit
)。6.29 重生限制
重生是有限制的。如果职业重生次数超过 COUNT 次在间隔秒数,则将被视为存在更深层次的问题,并将被停止。默认数数是10。 默认 间隔是5秒。
使用:
respawn respawn limit unlimited
检查其日志如下如何调试 upstart 脚本?。您可以创建自己的自定义日志来跟踪更具体的问题使用
pre-start
、post-start
&post-stop
脚本并检查变量,如RESULT
和PROCESS
,请参阅Upstart:重生和失败的报告(电子邮件、日志)start on runlevel [2345]
!!! 您确定运行级别是启动此服务的唯一必要条件吗?示例:该 c++ 守护进程是否需要filesystem
,networking
.. 请参阅Upstart 有哪些活动?有人习惯
start on stopped rc
避免寻找每个事件,来源:使用 upstart 以实时优先级启动 jackd
参考:
答案2
调试
默认情况下,系统将 upstart 文件的日志存储在 中
/var/log/upstart
。通常,它以 name_of_upstartfile.log 的形式存储在 中/var/log/upstart
。查看/var/log/upstart/file.log
。其中 file.log 是您的初始化文件的日志/etc/init/file.conf
。您可以轻松识别 upstart 脚本中缺少的内容。
检查 upstart 文件的语法
init-checkconf /etc/init/file.conf
或使用更多调试模式
init-checkconf -d /etc/init/file.conf
使用 start on local-filesystems
或start on (local-filesystems and net-device-up IFACE!=lo)
代替start on runlevel [2345]
。您正在执行需要本地文件系统的命令,如果还需要网络,则添加网络或检查其他要求。仍然存在问题,然后发布日志或错误。