我遇到了一个问题,即制作一个新贵脚本会多次调用该脚本,导致我的 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
Run Code Online (Sandbox Code Playgroud)
这与我想要的完全一样,除了:
stop ircd
Run Code Online (Sandbox Code Playgroud)
说它会停止它,但之后 inspircd 仍在运行。
有没有比使用 start-stop-daemon 更好的方法来阻止脚本打开 8 个实例,或者有什么方法可以使它与 start-stop-daemon 兼容?
我不能完全确定,但 inspircd 可能会在它运行时分叉,所以 Upstart 不知道它的 PID 到底在哪里。如果是这种情况,它可以被修复,因为 Upstart 有两个节来处理分叉过程:
expect fork 捕获分叉一次的进程(imo,很可能是这种情况)。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
Run Code Online (Sandbox Code Playgroud)
如果这不起作用,请检查我的su-statement 以确保它可以从命令行运行,然后更改expect fork为expect daemon并再试一次。
编辑bash包装器可能弊大于利。这可能是一个更好的 exec:
exec sudo -u ircuser /home/ircuser/inspircd/run/bin/inspircd -- --config=/home/ircuser/inspircd/run/conf/inspircd.conf
Run Code Online (Sandbox Code Playgroud)