/etc/inittab 重生脚本从 RHEL/CentOS 5.x 迁移到 6.x

/etc/inittab 重生脚本从 RHEL/CentOS 5.x 迁移到 6.x

我在 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 命令仅理解用于控制作业的启动、停止、状态动词。没有可用的重新启动动词。

干杯!

相关内容