由于找不到任何示例,我根据 memcached 附带的 init.d 脚本编写了一个 upstart 脚本。问题是,当我终止进程时,它不会自动重生。
env DAEMON=/usr/bin/memcached
env DAEMONBOOTSTRAP=/usr/share/memcached/scripts/start-memcached
start on started
stop on runlevel [!2345]
respawn
post-stop script
start-stop-daemon --stop --pidfile /var/run/memcached.pid --name memcached --chuid nobody --user nobody --exec $DAEMON --signal TERM
end script
exec start-stop-daemon --start --quiet --exec $DAEMONBOOTSTRAP
答案1
这是一个好的开始,但是你可能对 upstart 存在一些误解:
start on started
每次启动时都会触发 started 事件任何系统上的作业已启动。您可能想在启动后添加其他内容,例如start on started networking
。不幸的是,这也是不正确的,因为网络并不像其名称所暗示的那样有意义。对于 memcached,它几乎可以在达到运行级别 2 后的任何时间运行。因此
start on runlevel [2345]
有效,并且是必要的,因为你的停止规则:
stop on runlevel [!2345]
我知道这有点令人困惑,但实际上你必须在这里使用“^”而不是“!”,所以你想要
stop on runlevel [^2345]
还值得注意的是,这将在运行级别 1 上停止,即“单用户维护模式”。但您最初启动的程序不会在运行级别 2 上重新启动。那将是一个错误,因此请确保正确遵守运行级别。
您的 post-stop 和 exec 忽略了 upstart 将尝试跟踪此 pid 的事实,但由于 start-memcached 脚本退出(因为它允许 memcached 守护自身),pid 将丢失。这意味着 upstart 无法重生,因为它首先不知道 pid,并且不知道它已经死亡。
如果您希望能够重生它,您可能需要:
expect daemon
exec $DAEMONBOOTSTRAP
在这种情况下,无需使用 start-stop-daemon。Upstart 将跟踪 pid,当您执行“stop memcached”时,它将向其发送 SIGTERM。此外,在 Ubuntu 10.10 及更高版本中,memcached 的配置文件已以 root 以外的用户身份(实际上是 memcache)运行 memcached,因此您可能也不必担心更改用户 ID。
答案2
以下是我一直在使用的 Upstart 脚本memcached
。它受到 SpamapS 响应的强烈影响,但进行了关键调整以放弃使用start-memcached
。
使用start-memcached
结果在三个进程分支中创建最终的memcached
守护进程。Upstart 似乎仅支持零到三岔路口:
- 零分叉,无
expect
子句, - 一方使用该
expect fork
子句进行分叉,或者 - 带有
expect daemon
子句的两个叉子。
在我的测试中,使用expect daemon
包装start-memcached
器偶尔会导致 Upstart 跟踪错误的进程 ID,此时 Upstart 进入中断状态,Upstart 在尝试启动或停止进程时会挂起。这种情况很糟糕,如果不重启就很难解决。讨论导致评论 47,这里,如果发生这种情况,他会给出一些很好的建议。
因此,我不再使用start-memcached
包装器,而是简单地memcached
在下面的 Upstart 脚本中内联配置。由于该过程由 Upstart 直接运行,因此不需要子句expect
。内联中包含了一些其他注释。
description "memcached"
env MEMCACHED=/usr/bin/memcached
start on runlevel [2345]
# Not sure why it was recommended to use ^ rather than !. I'm sticking with !.
stop on runlevel [!2345]
# This test is completely optional, I'm just paranoid.
pre-start script
test -x $MEMCACHED || { stop; exit 0; }
end script
respawn
exec $MEMCACHED -m 384 -p 11211 -u memcache -l 127.0.0.1