zoukankan      html  css  js  c++  java
  • shell 脚本实现的守护进程

    转自:http://blog.csdn.net/cybertan/article/details/3235722

    转自:http://blog.sina.com.cn/s/blog_4c451e0e0100giqg.html

    设想:用一个shell查看一个后台运行的PHP程序是否非正常退出

    如果退出,利用守护进程自动restart.

    类似mysql的safe_mysqld

    共3个程序

    shstart.sh 负责启动

    sh.sh 守护进程主程序

    shstop.sh 安全退出守护进程和php程序主体

    /**************************/

    shstart.sh

    #!/usr/local/bin/bash

    /home/phpshell/sh.sh &

    shpid="$!";

    echo "$shpid" > /home/phpshell/sh.sid

    /**************************/

    sh.sh

    #!/usr/local/bin/bash

    PHP="/usr/local/bin/php"

    PROGRAM="/www/time.php"

    #start dameo

    $PHP $PROGRAM &

    chpid="$!";

    echo "$chpid" > /home/phpshell/php.sid

    echo "child pid is $chpid"

    echo "status is $?"

    while [ 1 ]

    do

    wait $chpid

    exitstatus="$?"

    echo "child pid=$chpid is gone, $exitstatus" >> /home/phpshell/phperror.log

    echo `date` >> /home/phpshell/phperror.log

    echo "**************************" >>/home/phpshell/phperror.log

    sleep 10

    $PHP $PROGRAM &

    chpid="$!";

    echo "$chpid" > /home/phpshell/php.sid

    echo "next child pid is $chpid"

    echo "next status is $?"

    echo "userkill is $userkill"

    done

    /******************************/

    shstop.sh

    #!/usr/local/bin/bash

    chpid="`cat sh.sid`";

    kill $chpid;

    echo "kill sh.sh done!"

    ps ax|grep php |grep -v grep|awk '{print $1}'|xargs kill

    sleep 2

    ps ax|grep php |grep -v grep|awk '{print $1}'|xargs kill

    echo "kill php done"

    利用这个原理,可以实现很多后台程序的吊线问题

     
     
     
     
     
     
     
     
     
    shell 脚本实现的守护进程 (2010-01-18 09:34:46)
    标签: shell 脚本 守护进程 杂谈 分类: *OS常见问题
    # #! 不是注释符,而是指定脚本由哪个解释器来执行,
    # #! 后面有一个空格,空格后面为解释器的全路径且必须正确。
    #! /bin/ash

    PRO_PATH=""
    # testpro 为要守护的可执行程序,即保证它是一直运行的
    PROGRAM="testpro"

    # 此脚本一直不停的循环运行,while <条件> 与 do 放在一行上要在条件后加分号
    # if、then、while、do等关键字或命令是作为一个新表达式的开头,
    # 一个新表达式之前的表达式必须以换行符或分号(;)来结束
    # 如果条件不是单个常量或变量而是表达式的话,则要用[]括起来
    # while、until与for循环皆以do开始以done结束构成循环体
    while true ; do
    # 休息10秒以确保要看护的程序运行起来了,这个时间因实际情况而定
        sleep 10
    # 单引号''中的$符与符没有了引用变量和转义的作用,但在双引号""中是可以的!
    # 单引号中如果还有单引号,则输出时全部的单引号都将去掉,单引号括住的内容原样输出。
    # 例:echo 'have 'test'' --> have test
    # ps aux --> a 为显示其他用户启动的进程;
    #                 u 为显示启动进程的用户名与时间;
    #                 x 为显示系统属于自己的进程;
    # ps aux | grep 可执行程序名 --> 在得到的当前启动的所有进程信息文本中,
    #                                            过滤出包含有指定文本(即可执行程序名字)的信息文本行
    # 注:假设 ps aux | grep 可执行程序名 有输出结果,但输出不是一条信而是两条,
    # 一个为查找到的包含有指定文本(即可执行程序名字)的信息文本行(以换行符0x10结尾的文本为一行),
    # 一个为 grep 可执行程序名 ,即把自己也输出来了,
    # 所这条信息是我们不需要的,因为我们只想知指定名字的可执行程序是否启动了
    # grep -v 指定文本 --> 输出不包含指定文本的那一行文本信息
    # wc -l --> 输出文件中的行数(-l --> 输出换行符统计数)
    # ps aux | grep $PROGRAM | grep -v grep | wc -l --> 如果有指定程序名的程序启动的话,结果大于壹
        PRO_NOW=`ps aux | grep $PROGRAM | grep -v grep | wc -l`

    # 整数比较:-lt -> 小于,-le -> 小于等于,-gt -> 大于,-ge -> 大于等于,-eq ->等于,-ne -> 不等于
    # if [条件] 与 then 放在一行上要在条件后加分号
    # 如果当前指定程序启动的个数小于壹的话
        if [$PRO_NOW -lt 1]; then
    # 0 -> 标准输入,1 -> 标准输出,2 - > 标准错误信息输出
    # /dev/null --> Linux的特殊文件,它就像无底洞,所有重定向到它的信息数据都会消失!
    # 2 > /dev/null --> 重定向 stderr 到 /dev/null,1 >& 2 --> 重定向 stdout 到 stderr,
    # 直接启动指定程序,且不显示任何输出
    # 可执行程序后面加空格加&,表示要执行的程序为后台运行
            ./$PROGRAM 2>/dev/null 1>&2 &
    # date >> ./tinfo.log --> 定向输出当前日期时间到文件,添加到文件尾端,如果没有文件,则创建这个文件
            date >> ./tinfo.log
    # echo "test start" >> ./tinfo.log --> 定向输出 test start 添加到文件尾端
            echo "test start" >> ./tinfo.log
    # if 分支结构体结束
        fi

    # 基本与上面的相同,就是多了一个 grep T,其结果为过滤出含 T 字符的信息行
    # T --> 进程已停止,D --> 不可中断的深度睡眠,R --> 进程运行或就绪,S --> 可接收信号的睡眠,
    # X --> 已完全死掉,Z --> 已完全终止
        PRO_STAT=`ps aux|grep $PROGRAM |grep T|grep -v grep|wc -l`

    # 如果指定进程状态为已停止的信息大于零的话
        if [ $PRO_STAT -gt 0 ] ; then
    # killall --> 用名字方式来杀死进程,-9 --> 即发给程序一个信号值为9的信号,即SIGKILL(非法硬件指令)
    # 也可以不指定信号,默认为SIGTERM,即信号值为15
            killall -9 $PROGRAM
            sleep 2
            ./$PROGRAM 2>/dev/null 1>&2 &
            date >> ./tinfo.log
            echo "test start" >> ./tinfo.log
        fi
    # while、until与for循环皆以do开始以done结束构成循环体
    done
    # exit 用来结束脚本并返回状态值,0 - 为成功,非零值为错误码,取值范围为0 ~ 255。
    exit 0
  • 相关阅读:
    Android系统框架
    get请求在ie浏览器下有缓存
    select2的基本用法
    js 获取url中的查询字符串
    常用的正则验证
    此计算机当前已经连接限制为。。
    sharepoint 备份和还原site脚本
    sharepoint 删除list里的所有内容
    ajax调用服务的基本格式
    rest的config
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4205975.html
Copyright © 2011-2022 走看看