我在 CentOS 5.7 中有一个非分叉 perl 脚本作为 TCP 套接字守护进程运行(此脚本是多人游戏的后端)。它由 /etc/inittab 启动和重生:
pref:3:respawn:/bin/su -c '/usr/local/pref/pref.pl >/tmp/pref-`date +%a`.txt 2>&1' afarber
它每晚都会由 cronjob 重新启动:
33 1 * * * kill `cat /tmp/pref.pid`
(其中 /tmp/pref.pid 文件由脚本本身创建)。
这个设置对我来说已经运行了很久了。现在我正尝试升级到 CentOS 6.x,并创建了一个新的/etc/init/pref.conf读取“man 5 init”后的文件:
start on stopped rc RUNLEVEL=3
stop on starting rc RUNLEVEL=[!3]
console output
respawn
chdir /tmp
exec /bin/su -c '/usr/local/pref/pref.pl >/tmp/pref-`date +%a`.txt 2>&1' afarber
并可以开始
# sudo initctl start pref
pref start/running, process 2590
还可以使用“ps uawx”查看在用户 afarber 下运行的脚本,并使用“netstat -an”监听端口 8080(应该如此)。
但是我的问题是我无法停止或重新启动脚本(而我需要它来完成夜间的 cronjob):
# sudo initctl restart pref
initctl: Unknown instance:
# sudo initctl stop pref
initctl: Unknown instance:
请问有什么想法吗?
(而且我不想安装任何第三方软件,例如 daemontools/Tivoli/等等 - 因为我希望我的网络服务器能够轻松重新安装并移动到其他托管商)。
更新:这是我所看到的 -
# initctl reload-configuration
# initctl list
rc stop/waiting
tty (/dev/tty3) start/running, process 1515
tty (/dev/tty2) start/running, process 1513
tty (/dev/tty1) start/running, process 1511
tty (/dev/tty6) start/running, process 1521
tty (/dev/tty5) start/running, process 1519
tty (/dev/tty4) start/running, process 1517
plymouth-shutdown stop/waiting
control-alt-delete stop/waiting
kexec-disable stop/waiting
quit-plymouth stop/waiting
rcS stop/waiting
prefdm stop/waiting
pref start/running, process 1507
init-system-dbus stop/waiting
splash-manager stop/waiting
start-ttys stop/waiting
rcS-sulogin stop/waiting
serial stop/waiting
# initctl status pref
pref start/running, process 1507
# initctl restart pref
pref start/running, process 2083
# initctl restart pref
initctl: Unknown instance:
# initctl restart pref
initctl: Unknown instance:
更新2:
我的脚本有两个特点:
1)当它收到 SIGTERM 或 SIGINT 时,它会将一些数据写入 PostgreSQL,这需要 10-15 秒
2)当多次启动时,后续运行将立即失败,因为只有第一个实例能够监听 TCP 端口 8080
在 /var/log/messages 中我看到:
...
17:44:25 static init: pref main process ended, respawning
17:44:26 static init: pref main process (2128) terminated with status 98
17:44:26 static init: pref main process ended, respawning
17:44:26 static init: pref main process (2133) terminated with status 98
17:44:26 static init: pref respawning too fast, stopped
这是否可能是所有原因?我能做些什么吗?(也许以某种方式延迟后续的产卵?)
答案1
'initctl list' 显示什么?创建作业后,您是否尝试过 'initctl reload-configuration'?
答案2
问题是,您的进程似乎自行终止。我们没有 pid 为 2083 的进程的日志消息,但我怀疑它在你发出下一个“initctl restart pref”之前意外死亡(例如 pid 2128 和 2133 死亡的方式)。关键是“initctl restart foo”仅有效如果富作业名称仍在运行。如果它已停止,则需要执行正常的“initctl start foo”。我也遇到过这种情况。我明确调用了“initctl stop foo”,然后期望“initctl restart foo”像它们对 init 脚本所做的那样工作。但事实并非如此。您必须使用“initctl start foo”。
答案3
查看 initctl 的手册页将会找到答案。initctl 命令仅理解用于控制作业的启动、停止、状态动词。没有可用的重新启动动词。
干杯!