用Shell脚本定时监控Linux下的进程状态并自动重启

àì夳堔傛蜴生んèń 2021-11-22 10:31 985阅读 0赞

以mysql为例,先上shell脚本,如下:

  1. #!/bin/bash
  2. ps -ef | grep mysqld | grep -v grep
  3. if [ $? -ne 0 ]
  4. then
  5. echo "start process......"
  6. /etc/rc.d/init.d/mysqld start
  7. else
  8. echo "runing......"
  9. fi

以上脚本是从网上转载,实际运行中发现使用ps命令,无论是否匹配到,该行命令的均为正确执行 ,(返回的参即$?一直为0),所以程序永远不会执行非零状态下的命令, 因此本人使用grep命令输出行数,通过判断输出的行数来解决这种问题:
问题:解决ssh服务端,自动失效的问题,定时监控重启ssh服务

源码:

  1. #!/bin/bash
  2. line=$(ps -aux | grep -c /usr/sbin/ssh | grep -v "grep") # 匹配的行数
  3. if [ $line -eq 1 ];then
  4. sudo /etc/init.d/ssh restart # 重启ssh服务
  5. else
  6. echo ssh is running.... # 向日志发送邮件,显示ssh运行中。。。
  7. fi

在这里插入图片描述
保存脚本,手动运行一下,确保没有错误。
执行crontab -e,来进入定时设置

  1. crontab -e

这里设置每天的上午8点到下午6点之间每分钟执行一次脚本

  1. * 8,18 * * * /test/test.sh

/test/test.sh 是shell脚本的绝对路径

设置好后重启crontab服务,命令如下:

  1. sudo /etc/init.d/cron restart

Linux下定时任务的查看及取消

  1. crontab -l 表示列出所有的定时任务
  2. crontab -r 表示删除用户的定时任务,当执行此命令后,所有用户下面的定时任务会被删除,执行crontab -l后会提示用户:“no crontab for admin

该文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令。
每个域之间使用空格或者制表符分隔。格式如下:

  1. minute hour day-of-month month-of-year day-of-week commands
  2. 分钟 小时 每个月的哪天 每年的哪月 每个星期的礼拜几 需执行的命令

合法值 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代表星期日)
第六个字段是一个要在适当时间执行的字符串

几个例子:

  1. 每五分钟执行一次: */5 * * * *
  2. 每小时执行一次 0 * * * *
  3. 每天执行一次: 0 0 * * *
  4. 每周执行一次: 0 0 * * 0
  5. 每月执行一次: 0 0 1 * *
  6. 每年执行一次: 0 0 1 1 *

每天早上6点

  1. 0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。

每两个小时

  1. 0 */2 * * * echo "Have a break now." >> /tmp/test.txt

晚上11点到早上8点之间每两个小时和早上八点

  1. 0 23-7/28 * * * echo "Have a good dream" >> /tmp/test.txt

每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

  1. 0 11 4 * 1-3 command line

1月1日早上4点

  1. 0 4 1 1 * command line SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号 HOME=/

每小时执行/etc/cron.hourly内的脚本

  1. 01 * * * * root run-parts /etc/cron.hourly

每天执行/etc/cron.daily内的脚本

  1. 02 4 * * * root run-parts /etc/cron.daily

每星期执行/etc/cron.weekly内的脚本

  1. 22 4 * * 0 root run-parts /etc/cron.weekly

每月去执行/etc/cron.monthly内的脚本

  1. 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时执行命令。

  1. 51525354555 161718 * * * command

每周一,三,五的下午3:00系统进入维护状态,重新启动系统。

  1. 00 15 * * 135 shutdown -r +5

每小时的10分,40分执行用户目录下的innd/bbslin这个指令:

  1. 1040 * * * * innd/bbslink

每小时的1分执行用户目录下的bin/account这个指令:

  1. 1 * * * * bin/account

每天早晨三点二十分执行用户目录下如下所示的两个指令(每个指令以;分隔):

  1. 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文件位于用户自己的目录位置)。

  1. 12,55 3 4-9 1,4 * /bin/rm -f expire.1st$#@62;$#@62;mm.txt

发表评论

表情:
评论列表 (有 0 条评论,985人围观)

还没有评论,来说两句吧...

相关阅读