新贵的 memcached

新贵的 memcached

由于找不到任何示例,我根据 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

相关内容