一个简单的脚本守护进程
2016-09-13 12:58
232 查看
一、背景
项目过程中,经常会有很多的脚本,Shell脚本、
PHP脚本、
Python脚本等,更有一些脚本是需要常驻内存执行的,简而言之就是需要
while(true){}的模式执行。
但是有的时候,一个常驻内存的进程会因为某些耗时操作而
夯住,不再往下继续执行,成为了一个
僵尸进程;或者因为某个操作偶然出错,直接退出了;所以我们需要有一套简单的机制来保证进程一直处于活跃状态。
二、方案
以一个PHP脚本为例:脚本中依然采用
while(true){}方式,但是额外增加一个
执行时间的控制,即,设定当前脚本执行超过某个时间之后,自动退出
脚本自动退出之后,通过一个
守护进程自动重启
三、实现
1、PHP脚本范例
脚本名称:script/monitor/Collect.class.phpclass 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 <<EOF 守护进程使用方法(需要 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
每分钟检测一次,没有启动则自动重启!通过这种方式来保证,脚本一定不死。
相关文章推荐
- 一个简单的脚本守护进程
- 创建一个简单的守护进程
- 一个简单的守护进程的编写
- 这里简单介绍一个自己写的检测某个进程是否存在的bash小脚本
- 如何写一个简单的守护(精灵)进程原型
- 如何给脚本写一个守护进程?
- 一个简单的守护进程的编写
- 如何写一个简单的守护(精灵)进程原型
- linux 一个简单守护进程实例
- 一个守护vsftp进程的脚本
- 一个简单的守护进程
- 利用Linux守护进程机制完成一个简单系统监控demo
- 怎么写一个简单的守护进程
- 一个极简的守护进程Bash脚本
- 一个简单的守护进程的编写
- 创建一个简单的守护进程
- 六十 如何写一个简单的守护(精灵)进程原型
- 简单实现一个守护进程(Daemon)
- 一个简单的GNU 守护进程的创建
- 一个简单的linux守护进程