克服一个表现不佳的Linux进程?

时间:2009-06-03 16:56:02

标签: linux bash scripting

我有一个表现糟糕的过程(通过用户命令启动),它以不稳定的间隔死亡,我需要它保持活着,直到我手动杀死它。这是我的直接但可能是愚蠢的解决方案:

#!/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信号,我可以重启它吗?你觉得怎么样?

4 个答案:

答案 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