如何仅当进程失败时重新启动它,而不是在进程正常退出(或带有某些返回代码)时重新启动它?

如何仅当进程失败时重新启动它,而不是在进程正常退出(或带有某些返回代码)时重新启动它?

我遇到了一个奇怪的问题,可能与硬件初始化有关。我正在开发一个基于 Java 的自动数据采集系统,该系统在装有 Ubuntu 16.04 的 SBC 上运行。数据采集程序目前通过 cron 启动,但我计划切换到 systemd。

如果我重新启动系统,它就可以正常启动并运行。但是,如果关闭电源并冷启动(这是正常方式),程序就会崩溃并出现错误free(): corrupted unsorted chunks。如果我再次启动它,它似乎运行良好。我需要找出原因,希望能够找到,但这可能需要一些时间,同时系统需要进一步测试,我需要一种在系统崩溃时重新启动它的解决方法。仅仅增加延迟是没有用的。

我想做的是重新启动 Java 进程或从 bash 包装器脚本重新启动系统,但前提是它崩溃了。如果它以零退出代码退出(或者,理想情况下,以预定的一组允许退出代码中的任何代码退出),则不应重新启动它,并且脚本也应退出。

答案1

如果您可以编写 Bash 脚本,请安排该脚本而不是您的程序:

#!/bin/bash
myprogram
while [ $? -ne 0 ]; do
    myprogram
done

此脚本将重新启动您的程序,直到它以 0 错误代码退出(表示成功)。此外,重新启动整个系统似乎轻微地对我来说太过了。

答案2

除了@Nathan.Eilisha Shiraini 解决方案之外,还考虑到在 Bash 中模拟 do-while 循环

#!/bin/bash
while : ; do
    myprogram
    [[ $? -ne 0 ]] || break
done

相关内容