以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

shell脚本监控进程 重启 shell监控进程状态_定时任务


保存脚本,手动运行一下,确保没有错误。

执行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