Linux监控服务并主动重启
Linux查询后台进程,如果没有进程号,则重启服务:
#!/bin/sh basepath=$(cd `dirname $0`; pwd) while true do procnum=`ps -ef|grep "服务名称"|grep -v grep|wc -l` if [ $procnum -eq 0 ] then #启动命令 echo `date +%Y-%m-%d` `date +%H:%M:%S` "restart 服务" >>$basepath/shell.log fi sleep 1 done
结合 crontab命令
对于24小时开机运行的服务器可能用不到的,但是对非24小时开机,又想定时运行任务的机器还是十分有用的。
crontab [-u user] [-l | -r | -e] [-i]
-l:列出当前用户的计划任务。
-e:编辑当前用户的计划任务。
-r:删除当前用户的所有计划任务。即删除/var/spool/cron/USERNAME文件。
-u:管理指定用户的计划任务,仅root有权限。
-i:在使用-r选项删除所有任务时提示用户确认。
crontab的语法
crontab分为两类:
1、系统cron任务
系统的crontab存放在 /etc/crontab
# vim /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
a、每一行定义一个周期性任务,共7个字段。
b、此处的环境变量不同于用户登录后获得的环境,因此建议命令使用绝对路径。
c、执行结果会发送邮件给mailto指定的用户。
2、用户cron任务
用户的crontab文件存放在 /var/spool/cron/USERNAME
# crontab -e -u USERNAME
a、每一行定义一个周期性任务,共6个字段。
b、此处的环境变量不同于用户登录后获得的环境,因此建议命令使用绝对路径。
c、执行结果会发送邮件给当前用户。
星号(*)匹配所有有效的值。
短横线(-)表示范围连续取值。
逗号(,)表示离散取值。
正斜线(/)指定间隔频率。例如,0-59/2 在分钟字段表示每两分钟。
指定的时间点不能被步长整除时,其意义将不存在。例如 */7 * * * *
注意:%在crontab中被认为是newline,使用时需要用 \ 转义。比如crontab文件中,如果有 "date +%Y%m%d",必须替换为:"date +\%Y\%m\%d"。
crontab的最小时间单位为”分钟“,想完成”秒“级任务
分钟 小时 几号 月份 星期几 */5 * * * * 每5分钟执行一次 3 * * * * 每小时的第3分钟执行一次 3 4 * * 5 每周5的4点3分执行一次 5 6 7 * * 每月的7号的6点5分执行一次 7 8 9 10 * 每年的10月9号8点7分执行一次 9 8 * * 3,7 每周3和周日的8点9分 0 8,20 * * 3,7 每周3和周日的8点和20点执行一次 0 9-18 * * 1-5 周一到周五的9-18点,即工作时间内的每小时 0 7 25 12 * 每年的12月25号7点执行一次
查看所有用户的crontab
# for u in `cat /etc/passwd | cut -d":" -f1`;do crontab -l -u $u;done
查看cron的日志
# tail -50f /var/log/cron