我遇到一个问题,编写 upstart 脚本会多次调用该脚本,导致我的 IRCd 生成大约 8 次左右。为了纠正这个问题,我使用了 start-stop-daemon:
description "IRC Daemon Upstart Script"
start on startup
start on runlevel [2345]
stop on runlevel [016]
respawn
nice -5
exec start-stop-daemon --start --chuid ircuser --chdir /home/ircuser/inspircd/run --exec /home/ircuser/inspircd/run/bin/inspircd -- --config=/home/ircuser/inspircd/run/conf/inspircd.conf
这完全符合我的要求,除了:
stop ircd
说它停止了,但是 inspircd 之后仍然在运行。
有没有比使用 start-stop-daemon 更好的方法来阻止脚本打开 8 个实例,或者有没有办法使它与 start-stop-daemon 兼容?
答案1
我不能完全确定,但 inspircd 可能会在运行时分叉,因此 Upstart 不知道其 PID 到底在哪里。如果是这种情况,则可以修复,因为 Upstart 有两个用于处理分叉进程的节:
expect fork
捕获分叉一次的进程(在我看来,这里的情况最有可能)。expect daemon
抓住两次分叉的东西……这可能正在做。
尝试一下这个:
description "IRC Daemon Upstart Script"
start on startup
start on runlevel [2345]
stop on runlevel [016]
respawn
expect fork
nice -5
exec su bash -c "cd /home/ircuser/inspircd/run; /home/ircuser/inspircd/run/bin/inspircd -- --config=./conf/inspircd.conf" ircuser
如果这不起作用,请检查我的su
语句以确保它可以从命令行工作,然后更改expect fork
为expect daemon
并再试一次。
编辑bash
包装器可能会弊大于利。这可能是更好的执行方式:
exec sudo -u ircuser /home/ircuser/inspircd/run/bin/inspircd -- --config=/home/ircuser/inspircd/run/conf/inspircd.conf