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

时间: 2024-11-11 08:32:35

shell 脚本实现的守护进程的相关文章

shell脚本中重启tomcat进程

shell脚本 #! /bin/bash SHUTDOWN="/root/tomcat/bin/shutdown.sh" STARTTOMCAT="/root/tomcat/bin/startup.sh" echo "关闭tomcat" $SHUTDOWN ps -ef |grep tomcat |grep /root/platform |grep -v 'grep'|awk '{print $2}' | xargs kill -9 sleep

shell脚本抓取问题进程

引用原文shell脚本:#/bin/bashLOAD=$(awk '{print $1}' /proc/loadavg)CPUNUM=$(grep -c processor /proc/cpuinfo) if [ $(echo "$LOAD > $CPUNUM" | bc) = 1 ]; then    RESULT=$(ps -eo pcpu,pmem,user,args | awk '$1 > 0' | sort -nr)    if [ -n "$RESUL

linux下Shell编程--标准的守护进程的启动脚本

一个标准的守护进程的启动脚本: #! /bin/sh WHOAMI=`whoami` PID=`ps -u $WHOAMI | gerp mydaemond | awk '{print $1}'` if (test "$1" = "") then echo "mydaemond [start][stop][version]" exit 0 fi if ( test "$1" = "status") then

在linux中安装jdk以及tomcat并shell脚本关闭启动的进程

在命令行模式中输入uname -a ,如下图,当界面展示i386就说明本linux系统为32版本,就在官网下载对应jdk版本,或者直接到我的网盘上下载http://pan.baidu.com/s/1cqMNd8 将下载好的tar包通过rz命令上传到服务器路径/usr/local下并通过命令解压:tar -xf jdk-7u67-linux-i586.tar.gz 编辑系统隐藏文件profile文件并添加jdk的path,命令:vi /etc/profile,在打开的界面通过i命令在该闻文本的结尾

Shell脚本之监视指定进程的运行状态

在之前的博客中,曾经写了自动化测试程序的实现方法,现在开发者需要知道被测试的进程(在此指运行在LINUX上的主进程的)在异常退出之前的进程的运行状态,例如内存的使用率.CPU的使用率等. 现用shell脚本实现指定进程的运行状态. 直接上代码. #!/bin/sh echo "`date`" echo "Start $0---------" echo "" #每十秒监视一下 sec=10 #取得指定进程名为mainAPP,内存的使用率,进程运行状

Linux shell 脚本 实现查询出进程的名字,cup内存占用率,启动时间在线状态等格式化输出

目的是查询出进程的名字,cup内存占用率,启动时间在线状态等格式化输出 脚本实现的结果:[[email protected] ~]# sh /app/shell/app_status.shProcessName---------GroupName-------Status-----PID----CPU----MEMORY----StarTime---nginx WEB STOPED NULL NULL NULL NULLhttpd WEB STOPED NULL NULL NULL NULLmy

Shell 脚本 ,, 根据进程号退出 从而关机

#!/bin/bash fun(){ ps -ef | grep "$1" | awk '{print $2 $8}' > /usr/file while read line ;do if [[ $line == $1 ]] then # do something // return fi done < /usr/file echo "shutdown ... after 3s " sleep 3 shutdown -h now } while true

linux shell脚本守护进程监控svn服务

最近搭建的svn服务不知道什么原因服务总是被关闭(如果你不知道怎么搭建svn可以参考linux下搭建svn版本控制软件),因此用shell脚本实现一个守护进程.用于监控svn服务是否启动,如果服务不在则启动. 创建监控脚本svnmonit.sh #! /bin/sh #进程名字可修改 PRO_NAME=svnserve PORT=58652 REP_DIR=/www/svndata while true ; do #用ps获取$PRO_NAME进程数量 NUM=`ps aux | grep ${

让python脚本在linux的后台执行,使其成为守护进程

在里以python脚本为例 #vim /etc/init/open-status.conf 其中open-status.conf中的内容即为我们要编辑的,在后续启动中也会用到(open-status),如start open-status其实就是调用了open-status.conf的配置. 内容如下: description "Listen to the status information of the openvpn and connect to the database to write