`

用shell脚本监控进程,挂掉后重启

阅读更多

一.

一个php脚本,经常跑了好几个小时,然后莫名其妙的挂掉,不胜其烦。在没有找到真正的原因之前,只好先写一个daemon作用的shell script来monitor,在发现脚本挂掉后,重启脚本.

 

以下是在chinaunix找到的相关内容,汇集了各位大神们的意见:

http://bbs.chinaunix.net/thread-1487627-1-1.html

 

============================================================

请教如何写一个shell监控我的一个进程状态,死了重启

#/bin/sh
while true; do
                count=`ps -fe |grep "main" | grep -v "grep"`
                if [ "$?" != "0" ]; then
    echo ">>>>no main,run it"
    else
    echo ">>>>main is running"
    fi
    sleep 2
done

 
---------------------------------分割线----------------------------------------------
按照2楼的方法,我的板子里没有wc,也没有crontab

我在终端上执行这个脚本./test,能正确检测,
但是我执行./test &,不管main有没有,都是输出no main,run it

---------------------------貌似解决了------------------------------------
在done后面加 &

============================================================

 

 整体思路看来就是:实现查找进程(ps -ef|grep命令),截取进程字符串关键信息判断是否为空(字符串赋值),执行重启命令(为空时)或跳过(不为空时),用crontab或者循环语句实现定时判断。

 

发现一个哥们儿写的比我好,拿过来给大家借鉴一下。

#!/bin/bash
CheckProcess()
{
        if [ "$1" = ""];
        then
                return 1
        fi

    PROCESS_NUM=`ps -ef | grep "$1" | grep -v "grep" | wc -l`
    if [ $PROCESS_NUM -eq 1 ];
    then
        return 0
    else
        return 1
    fi    
} 

while [ 1 ] ; do
    CheckProcess "./a.out"
    CheckQQ_RET=$?
    if [ $CheckQQ_RET -eq 1 ];
    then
     killall -9 a.out
     exec ./a.out &
    fi
    sleep 1
done
 

 

二.

然后, if 的真正模型是:

if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi

其实, bash中的help if就给了你正确的答案, 但我不知道什么原因无数人就是忽略了它, 而非常多的bash教学资料中都采用了本文开头提出的那种模型来告诉你关于if 结构的事.

注意: [ "$1" = "-a" ] 只一个命令, [ 是命令名!, "$1"是第一个参数, =是第二个参数, "-a"是第三个, ]是第4个. 是[这个命令, 而不是bash本身在报怨 [ "$1" = "-a"] 这样的结构造成的错误, 因为[这个命令对它的参数有所期望, 它期望最后一个参数是 ], 而你用"-a"] 这种连写的形式, 它得到的就只有3个参数: $1, = 和 -a].

 

三.

在运行该脚本时,发现如下错误:syntax error near unexpected token `else'

问题解决:

1.使用 sh -x change.sh看看哪个地方的有问题

2.使用 dos2unix 字符转换工具 convert file formating

3.如果还没有解决,那只能手动将内容重写一遍

 

老外这么说:

Solution:
The customer in this case had downloaded the script off our website from a Win95 box,
and then moved the file to the Linux box. This caused DOS ASCII end-of-line characters
to be placed in the script. The solution is to download the script from the Linux box, as
moving it from the Windows environment will always place undesireable characters in
the script.

Or ftp the file in ASCII mode when transfering from Win95 to Linux.

 

 

分享到:
评论

相关推荐

    linux进程监控与自动重启的简单实现方法

    linux 下服务器程序会因为各种原因dump掉,就会影响用户使用,这里提供一个简单的进程监控和重启功能。 实现原理: 由定时任务crontab调用脚本,脚本用ps检查进程是否存在,如果不存在则重启并写入日志。 crontab...

    linux下监视进程 崩溃挂掉后自动重启的shell脚本

    2. 使用`grep -v "grep"`来排除`grep`命令自身,否则`grep`的进程也会被误认为是要监控的进程,导致脚本无法正常判断。 这个脚本设计的目的是确保`loader`服务始终处于运行状态。当服务意外停止时,脚本会在10秒后...

    shell脚本作为保证PHP脚本不挂掉的守护进程实例分享

    首先,使用shell脚本作为PHP脚本守护进程的目的,是为了确保长时间运行的PHP脚本能够在遇到意外中断时自动恢复运行,避免因为程序崩溃或者系统重启等原因导致任务无法完成。在本案例中,由于需要处理的数据量非常...

    auto_process.sh

    liunx 服务器shell 监控进程号的脚本,服务挂掉后,可执行重启服务。但前提需要将该脚本放到定时任务中; 如:* * * * * sh /home/kaiyuanuser/webspace/shell/auto_process.sh * * * * * sleep 15; sh /home/...

    入门学习Linux常用必会60个命令实例详解doc/txt

    -n:一般而言,mount挂上后会在/etc/mtab中写入一笔资料,在系统中没有可写入文件系统的情况下,可以用这个选项取消这个动作。 4.应用技巧 在Linux 和Unix系统上,所有文件都是作为一个大型树(以/为根)的一部分...

    IBM_AIX操作系统常见问题整理.pdf

    编写一个Shell脚本来杀进程,可以使用以下基本结构: ```bash #!/bin/bash # 获取进程ID PID=$(ps aux | grep 'process_name' | awk '{print $2}') # 检查进程是否存在 if [ ! -z "$PID" ]; then # 杀死进程 kill ...

    (重要)AIX command 使用总结.txt

    可以用该用户登录系统, 使用命令“ulimit -f”和“ulimit -Hf”可分别显示其fsize,fsize_hard的大小. //如何查看小型机适配器卡及硬盘的微码级别microcode level lscfg -vl device_name //查询SSA卡的微码级别 #...

Global site tag (gtag.js) - Google Analytics