利用cron监视后台进程状态(一)

1.

利用cron监视后台进程状态,如果进程死掉或服务器重启后自动拉起进程。

目的:Linux 下服务器程序会因为各种原因dump掉,就会影响用户使用,这里提供一个简单的进程监控和重启功能。

实现原理:由定时任务crontab调用脚本,脚本用ps检查进程是否存在,如果不存在则重启并写入日志。

每分钟调用一下脚本cron_worker.sh

$crontab -e 

*/1 * * * * sudo bash /home/test/OnlineAdsDemo/bin/cron_worker.sh

查看cron 启动计划表:$crontab -l

运行crontab -e 命令; 
如果出现得是:

Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.basic
  4. /usr/bin/vim.tiny
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

说明是第一次运行该命令,这里是让选择编译器的意思,喜欢用vim的童鞋可以选择3。

补充两点: 
1、如果选择了2,那个nano编辑器,可以按ctrl+x退出。 
2、如果不小心选择了2,那么又想改回vim怎么办呢?运行这个命令

select-editor
  • 1
  • 1

就又回到了选择编译器的界面上了。

选择完编辑器,就进入了编辑界面了,可以在这里添加计划任务: 

第一种是脚本执行了,但是报错:在crontab里调度运行,结果发现没有结果,查看/var/log/message 日志,发现crontab有执行,但是失败。
手动运行都是可以的,放在crontab里边发现就不能运行了。
处理方法:脚本中不要采用相对路径,全部改为绝对路径

第二种是编辑/var/spool/cron/user   user为执行用户名,一般为root
如更改后不起效果,请重新加载cron:
处理方法: /etc/init.d/cron reload 

第三种 用crontab -e  进行编辑
use the following command add entries to crontab should take effect right away.
#crontab -e

如还不行就从其服务:
处理方法:/etc/init.d/cron restart   

最后一定要记得重启cron:$/etc/init.d/cron start 。

如果任务没有执行,那么先查看crol进程的运行情况:

sudo service cron status
  • 1
  • 1

另外,还要注意,在执行任务的脚本中不能用相对路径,要用绝对路径。


2.cron_worker.sh脚本如下:

#! /bin/sh

host_dir=`echo ~`                                       # 当前用户根目录
proc_name="worker.py"                                   # 进程名
file_name="/OnlineAdsDemo/bin/cron_worker_log.log"                         # 日志文件
pid=0


proc_num()                                              # 计算进程数
{
	num=`ps -ef | grep $proc_name | grep -v grep | wc -l`
	return $num
}

proc_id()                                               # 进程号
{
	pid=`ps -ef | grep $proc_name | grep -v grep | awk '{print $2}'`
}

proc_num
number=$?
if [ $number -eq 0 ]                                    # 判断进程是否存在
then 
	cd $host_dir/OnlineAdsDemo/bin/;  ./run_worker.sh -DZone    # 重启进程的命令,请相应修改
	proc_id                                         # 获取新进程号
	echo ${pid}, `date` >> $host_dir$file_name      # 将新进程号和重启时间记录
fi

4.run_worker.sh 脚本如下:

#!/bin/bash
nohup python -u  ../worker.py >> error_log.txt 2>&1 &
nohup python -u  ../worker.py >> error_log.txt 2>&1 &
nohup python -u  ../worker.py >> error_log.txt 2>&1 &
nohup python -u  ../worker.py >> error_log.txt 2>&1 &
nohup python -u  ../worker.py >> error_log.txt 2>&1 &
nohup python -u  ../worker.py >> error_log.txt 2>&1 &
nohup python -u  ../worker.py >> error_log.txt 2>&1 &
nohup python -u  ../worker.py >> error_log.txt 2>&1 &
nohup python -u  ../worker.py >> error_log.txt 2>&1 &
nohup python -u  ../worker.py >> error_log.txt 2>&1 &

5. $ps -ef | grep worker.py 查看是否一次将10个进程拉起,如果拉起,该怎么批量kill这10个进程呢

stop_worker.sh 如下:

#!/bin/bash
sudo ps -ef | grep 'worker.py' | grep -v grep | awk '{print $2}' | xargs sudo  kill -9 


6.将以上cron_worker.sh通过FileZilla上传到目标服务器,手动执行时出现 $'\r': 未找到命令的解决的问题

  考虑到代码是从windows下一直过来的,脚本可能在格式上存在问题

    解决方案:

   sudo apt-get install dos2unix
   dos2unix **.sh








你可能感兴趣的:(利用cron监视后台进程状态(一))