我已经根据它附带的 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)
这是一个好的开始,但是您可能对 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。