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

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

我有一个由 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

那么如果创建一个带有循环的子 shell,并不断调用同一个进程会怎么样呢?

如果结束,循环的下一次迭代将继续并重新开始。

(while true; do 
    /bin/myprocess
done) &

但是如果子 shell 死了,一切就都结束了。在这种情况下,唯一的可能性就是创建另一个进程(我称之为 necromancer),检查你的进程是否还活着,如果还活着就启动它,并用 cron 运行这个 necromancer,这样你就可以定期检查了。

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

答案4

您可以使用重启程序

start)
   restarter -c /bin/myprocess &
stop)
   pkill -f myprocess

在较新的系统上使用 systemd 可以解决所有这些琐碎问题

相关内容