如果失败,如何自动重启linux后台进程?

Hon*_*nza 42 linux bash process daemon

我有一个由 init.d 脚本在后台执行的进程。例如:

case "$1" in 
    start)
       /bin/myprocess &
    stop)
       killall myprocess
    restart)
       killall myprocess
       /bin/myprocess &
esac
Run Code Online (Sandbox Code Playgroud)

在某些情况下,myprocess 可能会失败并返回。是否有任何(标准)方法来检测其故障并自动重新启动?

Jde*_*eBP 32

Buildroot 有三种可能的初始化系统,因此有三种方法可以做到这一点:

忙箱 init

有了这个,一个条目添加到/etc/inittab.

::respawn:/bin/myprocess
Run Code Online (Sandbox Code Playgroud)

请注意,BusyBoxinit具有特殊的/etc/inittab格式。第二个字段没有意义,第一个字段不是ID而是设备basename。

Linux“系统V” init

再一次,向 中添加一个条目/etc/inittab

myprocess:2345:respawn:/bin/myprocess
Run Code Online (Sandbox Code Playgroud)

systemd

一个人写一个单元文件,比如/etc/systemd/system/myprocess.service

[Unit]
Description=My Process

[Service]
ExecStart=/bin/myprocess
Restart=always

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

启用它以在启动时自动启动:

systemctl enable myprocess.service
Run Code Online (Sandbox Code Playgroud)

手动启动它:

systemctl start myprocess.service
Run Code Online (Sandbox Code Playgroud)

进一步阅读


Try*_*lks 27

创建一个带有循环调用相同进程的子shell怎么样?

如果它结束,则循环的下一次迭代继续并再次开始。

(while true; do 
    /bin/myprocess
done) &
Run Code Online (Sandbox Code Playgroud)

如果子外壳死了,它就结束了。在这种情况下,唯一的可能性是创建另一个进程(我将其称为死灵法师)来检查您的进程是否处于活动状态,如果不是则启动它并使用 cron 运行此死灵法师,以便您可以定期检查。

下一步会想知道如果 cron 死了会发生什么,但在某个时候你应该感到安全并停止担心。


Ala*_*tko 17

最简单的方法是将它添加到/etc/inittab,它旨在做这样的事情:

respawn 如果该进程不存在,则启动该进程。不要等待其终止(继续扫描 /etc/inittab 文件)。当它死亡时重新启动该过程。如果该进程存在,则什么都不做并继续扫描 /etc/inittab 文件。

例如,你可以这样做:

# Run my stuff
myprocess:2345:respawn:/bin/myprocess
Run Code Online (Sandbox Code Playgroud)

  • 请注意,当且仅当您有基于 sysvinit 的 init 系统时,“/etc/inittab”才有效(甚至存在)。对于 upstart 和 systemd 来说则不然。您必须安装 *busybox* (非常原始的 shell,使 sysadm 恢复任务很痛苦,但它可以替代 sysvinit 兼容的 initd)或 *sysvinit* (它是一个化石)。在docker容器中,只有第一个不痛苦。 (4认同)