我有一个由 init.d 脚本在后台执行的进程。例如:
case "$1" in
start)
/bin/myprocess &
stop)
killall myprocess
restart)
killall myprocess
/bin/myprocess &
esac
在某些情况下,myprocess 可能会失败并返回。是否有任何(标准)方法可以检测其失败并自动重新启动?
答案1
最简单的方法是将其添加到/etc/inittab,其设计目的是做这样的事情:
重生 如果进程不存在,则启动该进程。不要等待其终止(继续扫描 /etc/inittab 文件)。进程终止后,重新启动该进程。如果进程存在,则不执行任何操作,继续扫描 /etc/inittab 文件。
例如,你可以这样做:
# Run my stuff
myprocess:2345:respawn:/bin/myprocess
答案2
Buildroot 有三种可能的 init 系统,因此有三种方法可以做到这一点:
忙碌盒子init
通过此,可以添加一个条目到/etc/inittab
。
::respawn:/bin/myprocess
请注意,BusyBoxinit
具有特殊的/etc/inittab
格式。第二个字段无意义,第一个字段不是身份证而是一个设备基名。
Linux 系统 Vinit
再次,向中添加一个条目/etc/inittab
。
myprocess:2345:respawn:/bin/myprocess
systemd
例如,可以写入一个单元文件/etc/systemd/system/myprocess.service
:
[Unit]
Description=My Process
[Service]
ExecStart=/bin/myprocess
Restart=always
[Install]
WantedBy=multi-user.target
使用以下命令启用它在启动时自动启动:
systemctl enable myprocess.service
使用以下命令手动启动它:
systemctl start myprocess.service
进一步阅读
- “3.1.3 init 系统“。 Buildroot 用户手册。
答案3
那么如果创建一个带有循环的子 shell,并不断调用同一个进程会怎么样呢?
如果结束,循环的下一次迭代将继续并重新开始。
(while true; do
/bin/myprocess
done) &
但是如果子 shell 死了,一切就都结束了。在这种情况下,唯一的可能性就是创建另一个进程(我称之为 necromancer),检查你的进程是否还活着,如果还活着就启动它,并用 cron 运行这个 necromancer,这样你就可以定期检查了。
下一步是想知道如果 cron 死机会发生什么,但在某些时候你应该感到安全并停止担心。
答案4
您可以使用重启程序
start)
restarter -c /bin/myprocess &
stop)
pkill -f myprocess
在较新的系统上使用 systemd 可以解决所有这些琐碎问题