1.
利用cron监视后台进程状态,如果进程死掉或服务器重启后自动拉起进程。
目的:Linux 下服务器程序会因为各种原因dump掉,就会影响用户使用,这里提供一个简单的进程监控和重启功能。
实现原理:由定时任务crontab调用脚本,脚本用ps检查进程是否存在,如果不存在则重启并写入日志。
每分钟调用一下脚本cron_worker.sh
*/1 * * * * sudo bash /home/test/OnlineAdsDemo/bin/cron_worker.sh
查看cron 启动计划表:$crontab -l
运行crontab -e 命令;
如果出现得是:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
说明是第一次运行该命令,这里是让选择编译器的意思,喜欢用vim的童鞋可以选择3。
补充两点:
1、如果选择了2,那个nano编辑器,可以按ctrl+x退出。
2、如果不小心选择了2,那么又想改回vim怎么办呢?运行这个命令
- 1
- 1
就又回到了选择编译器的界面上了。
选择完编辑器,就进入了编辑界面了,可以在这里添加计划任务:
最后一定要记得重启cron:$/etc/init.d/cron start 。
如果任务没有执行,那么先查看crol进程的运行情况:
- 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