新贵内存缓存

mah*_*off 6 upstart

我已经根据它附带的 init.d 脚本为 memcached 编写了一个新贵脚本,因为我在任何地方都找不到任何示例。问题是当我终止进程时它不会自动重生。

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
Run Code Online (Sandbox Code Playgroud)

Spa*_*apS 3

这是一个好的开始,但是您可能对 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
Run Code Online (Sandbox Code Playgroud)

在这种情况下不需要使用start-stop-daemon。Upstart 将跟踪 pid,当你“停止 memcached”时,它会向它发送一个 SIGTERM。另外,在 Ubuntu 10.10 及更高版本中,memcached 的配置文件已经以 root 以外的用户(实际上是 memcache)运行 memcached,因此您可能也不需要担心更改 userid。