我有一个表现糟糕的过程(通过用户命令启动),它以不稳定的间隔死亡,我需要它保持活着,直到我手动杀死它。这是我的直接但可能是愚蠢的解决方案:
#!/bin/bash
if [ -z $1 ]
then
echo "Usage: /s98ize.sh <process name>"
exit
fi
#start of the 'polling' loop
while [ 1 ]
do
pgrep $1
if [ $? -eq 0 ]
then
echo "Already running"
else
# If process has died or not started, start it
$1
# FIXME: I have not done any error checking this script will not catch a
# unavailable command
fi
done
# end of the polling loop
要点是:如果上面的过程正在运行,那么“不做”,否则启动它。一个非常直接的缺点是它保持“轮询”。但是,它符合我的目的。
当我写这篇文章时,我想我可以对进程进行信号处理,这样一旦得到kill信号,我可以重启它吗?你觉得怎么样?
答案 0 :(得分:4)
您可以将它放在/ etc / inittab中,init(8)会自动为您重新启动它。
您可以定义进程运行的运行级别,因此不必在启动时启动。您还可以使用像sed(1)这样的程序以编程方式编辑inittab并为其添加一行,然后告诉init(8)使用以下命令来实现配置文件(并启动您的程序):init q
答案 1 :(得分:4)
您是否考虑过djb的supervise计划?它确实如此:运行一个程序,如果它退出就重新启动它,提供一种控制它的方法,等等?
答案 2 :(得分:1)
您应该尝试修复问题,而不是治愈症状。我的意思是找出为什么程序“正在死亡”(崩溃)并在可能的情况下修复它(大多数Linux程序都是开源的,并且能够让你完全这样做)。
要查找程序( wvdial )失败的原因,您可以执行此操作:
在启动wvdial的shell中使用 ulimit -c unlimited ,这样如果它崩溃,它将生成一个核心文件,然后使用 gdb --core / path /来调试它/ wvdial的
如果尚未安装包管理器,您可能需要先安装apps / libs的调试信息。
如果您不能(或不会)这样做,那么您可以使用monit自动重启您的流程。这是一个blog,显示了如何将monit用于Web服务器。
Monit是一个免费的开源实用程序,用于管理和监视UNIX系统上的进程,文件,目录和文件系统。 Monit进行自动维护和修复,并可在错误情况下执行有意义的因果行为。
答案 3 :(得分:1)
如果你想使用bash脚本重新生成一个进程,不要错误地依赖像pgrep这样的破坏工具。此外,您的bash代码会受到文字错误和意外路径名扩展错误的严重影响。
这样做:
#!/usr/bin/env bash
until "$@"; do
echo "$1 exited with exit code: $?. Respawning .."
sleep 1
done
sleep
是为了避免过程立即死亡造成无限循环,导致CPU干涸。
另请注意使用"$@"
。
until
关键字将继续重新启动您的进程,直到它完全退出(退出代码为0),这意味着它退出而不会出现问题(可能是因为您要求它停止,例如,重启系统时)。
假设它被称为“respawn
”并且在PATH中,请像这样使用它:
respawn mycommand --foo=bar