php+简单脚本例子,一个简单的脚本守护进程

一、背景

项目过程中,经常会有很多的脚本,Shell脚本、PHP脚本、Python脚本等,更有一些脚本是需要常驻内存执行的,简而言之就是需要while(true){}的模式执行。

但是有的时候,一个常驻内存的进程会因为某些耗时操作而夯住,不再往下继续执行,成为了一个僵尸进程;或者因为某个操作偶然出错,直接退出了;所以我们需要有一套简单的机制来保证进程一直处于活跃状态。

二、方案

以一个PHP脚本为例:

脚本中依然采用while(true){}方式,但是额外增加一个执行时间的控制,即,设定当前脚本执行超过某个时间之后,自动退出

脚本自动退出之后,通过一个守护进程自动重启

三、实现

1、PHP脚本范例

脚本名称:script/monitor/Collect.class.php

class Collect extends \Framework\FrameworkScript {

// 表示:脚本最多能活跃10分钟

private $interval = 600;

// 脚本入口

public function run() {

$start = time();

while (true) {

// here , do what you want to do...

// 如果数据为空,则10分钟自杀进程

if (time() - $start > $this->interval) {

exit(0);

}

}

}

}

2、守护进程范例

守护进程脚本名称:script/monitor/Watch.sh

#!/bin/bash

# @author xianliezhao

# crontab命令:

# 监控线上服务稳定性情况

# */1 * * * * sh /home/work/script/monitor/Watch.sh start >> /home/work/logs/script_monitor_watch.log

# PHP命令

php="/home/service/php/bin/php /home/work/mlservice/goods/public/script.php"

# 在这里配置所有需要【守护】的PHP进程

proc_list='monitor\\Collect monitor\\RealtimeAnalytics'

#work 账户运行

name=$(whoami)

if [ $name != 'work' ];then

echo `date "+%Y/%m/%d %H:%M:%S> "` "必须用work账户"

exit

fi

#开启服务

start() {

for proc in $proc_list ;do

arrm=$(ps -ef | grep "`echo $proc`" | grep -v 'grep' | awk -F'script.php' '{print $2}'| wc -l)

if [ ${arrm:-0} = 0 ];then

$php $(echo $proc | awk -F"\\" '{print $1"\\"$3}') >/dev/null &

echo `date "+%Y/%m/%d %H:%M:%S> "` "$proc 进程已经重启"

else

echo `date "+%Y/%m/%d %H:%M:%S> "` "$proc 进程已经存在"

fi

done

}

#停止服务

stop() {

for proc in $proc_list ;do

arrproc=$(ps -ef | grep "`echo $proc`" | awk '{print $2}')

for p in $arrproc; do

kill $p;

echo `date "+%Y/%m/%d %H:%M:%S> "` $p " 进程已杀死!"

done

done

echo `date "+%Y/%m/%d %H:%M:%S> "` "服务已停止!"

}

#check脚本是否运行

check() {

for proc in $proc_list ;do

arrspar=$(ps -ef | grep "`echo $proc`" | grep -v 'grep' | awk '{print $2}')

echo `date "+%Y/%m/%d %H:%M:%S> "` "目前运行的服务监控进程($proc):" ${arrspar:-"无"}

done

}

usage() {

cat <

守护进程使用方法(需要 work 用户执行):

usage: sh $0 check|start|stop|restart

start 启动服务

stop 停止服务

check 检查服务是否正常

EOF

exit

}

while true;do

case $1 in

start)

start

break

;;

help)

usage

break

;;

stop)

stop

break

;;

check)

check

break

;;

*)

usage

break

;;

esac

shift

done

四、使用

1、使用帮助

[work@script-01 monitor]$ sh Watch.sh

守护进程使用方法(需要 work 用户执行):

usage: sh Watch.sh check|start|stop|restart

start 启动服务

stop 停止服务

check 检查服务是否正常

2、检测脚本执行状态

[work@script-01 monitor]$ sh Watch.sh check

2015/09/24 15:10:48> 目前运行的服务监控进程(monitor\\Collect): 65321

2015/09/24 15:10:48> 目前运行的服务监控进程(monitor\\RealtimeAnalytics): 无

3、通过守护进程手动重启脚本

[work@script-01 monitor]$ sh Watch.sh start

2015/09/24 15:11:26> monitor\\Collect 进程已经重启

2015/09/24 15:11:26> monitor\\RealtimeAnalytics 进程已经重启

4、通过crontab自动守护

# crontab命令:

# 监控线上服务稳定性情况

*/1 * * * * sh /home/work/script/monitor/Watch.sh start >> /home/work/logs/script_monitor_watch.log

每分钟检测一次,没有启动则自动重启!通过这种方式来保证,脚本一定不死。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值