以mysql为例,先上shell脚本,如下:
#!/bin/bash
ps -ef | grep mysqld | grep -v grep
if [ $? -ne 0 ]
then
echo "start process......"
/etc/rc.d/init.d/mysqld start
else
echo "runing......"
fi
以上脚本是从网上转载,实际运行中发现使用ps命令,无论是否匹配到,该行命令的均为正确执行 ,(返回的参即$?
一直为0),所以程序永远不会执行非零状态下的命令, 因此本人使用grep命令输出行数,通过判断输出的行数来解决这种问题:
问题:解决ssh服务端,自动失效的问题,定时监控重启ssh服务
源码:
#!/bin/bash
line=$(ps -aux | grep -c /usr/sbin/ssh | grep -v "grep") # 匹配的行数
if [ $line -eq 1 ];then
sudo /etc/init.d/ssh restart # 重启ssh服务
else
echo ssh is running.... # 向日志发送邮件,显示ssh运行中。。。
fi
保存脚本,手动运行一下,确保没有错误。
执行crontab -e,来进入定时设置
crontab -e
这里设置每天的上午8点到下午6点之间每分钟执行一次脚本
* 8,18 * * * /test/test.sh
/test/test.sh 是shell脚本的绝对路径
设置好后重启crontab服务,命令如下:
sudo /etc/init.d/cron restart
Linux下定时任务的查看及取消
crontab -l 表示列出所有的定时任务
crontab -r 表示删除用户的定时任务,当执行此命令后,所有用户下面的定时任务会被删除,执行crontab -l后会提示用户:“no crontab for admin”
该文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令。
每个域之间使用空格或者制表符分隔。格式如下:
minute hour day-of-month month-of-year day-of-week commands
分钟 小时 每个月的哪天 每年的哪月 每个星期的礼拜几 需执行的命令
合法值 00-59 00-23 01-31 01-12 0-6 (0 is sunday) commands(代表要执行的脚本)
除了数字还有几个个特殊的符号就是"*"
、"/"
和"-"
、","
,*
代表所有的取值范围内的数字,"/"
代表每的意思,"/5"
表示每5个单位,"-"
代表从某个数字到某个数字,","分开几个离散的数字。
crontab文件中的行由6个字段组成,不同字段间用空格或者tab键分割。前5个字段指定命令要运行的时间
分钟(0-59)
小时(0-28)
日期(1-31)
月份(1-12)
星期几(0-6,其中0代表星期日)
第六个字段是一个要在适当时间执行的字符串
几个例子:
每五分钟执行一次: */5 * * * *
每小时执行一次 : 0 * * * *
每天执行一次: 0 0 * * *
每周执行一次: 0 0 * * 0
每月执行一次: 0 0 1 * *
每年执行一次: 0 0 1 1 *
每天早上6点
0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。
每两个小时
0 */2 * * * echo "Have a break now." >> /tmp/test.txt
晚上11点到早上8点之间每两个小时和早上八点
0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3 command line
1月1日早上4点
0 4 1 1 * command line SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号 HOME=/
每小时执行/etc/cron.hourly内的脚本
01 * * * * root run-parts /etc/cron.hourly
每天执行/etc/cron.daily内的脚本
02 4 * * * root run-parts /etc/cron.daily
每星期执行/etc/cron.weekly内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly
每月去执行/etc/cron.monthly内的脚本
42 4 1 * * root run-parts /etc/cron.monthly
注意: "run-parts"这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名。
每天的下午4点、5点、6点的5 min、15 min、25 min、35 min、45 min、55 min时执行命令。
5,15,25,35,45,55 16,17,18 * * * command
每周一,三,五的下午3:00系统进入维护状态,重新启动系统。
00 15 * * 1,3,5 shutdown -r +5
每小时的10分,40分执行用户目录下的innd/bbslin这个指令:
10,40 * * * * innd/bbslink
每小时的1分执行用户目录下的bin/account这个指令:
1 * * * * bin/account
每天早晨三点二十分执行用户目录下如下所示的两个指令(每个指令以;分隔):
20 3 * * * (/bin/rm -f expire.ls logins.bad;bin/expire$#@62;expire.1st)
每年的一月和四月,4号到9号的3点12分和3点55分执行/bin/rm -f expire.1st这个指令,并把结果添加在mm.txt这个文件之后(mm.txt文件位于用户自己的目录位置)。
12,55 3 4-9 1,4 * /bin/rm -f expire.1st$#@62;$#@62;mm.txt