Linux下定时任务

佐手、 提交于 2020-03-21 22:33:12

3 月,跳不动了?>>>

crontab介绍

        crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

      通过crontab命令,我们可以在固定的间隔时间执行指定的系统指令或shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。  

Linux任务调度的工作主要分为两类:

       系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存。 个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有更新,这些工作可以由每个用户自行设置。我设置的是每周一到周五定时发送邮件。

        系统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么做),但是反过来却不行,root用户的任务调度操作可以通过”crontab–uroot–e”来设置,也可以将调度任务直接写入/etc/crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个定时重启系统的任务也是无效的。

命令格式

crontab [-u user] file
crontab [-u user] {-e|-l|-r}

说明:

  • -u user:是指设定指定user的时程表,这个前提是你必须要有其权限(比如说是root)才能够指定他人的时程表。如果不指定user,使用crontab就会用在全局root下。
  • -e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
  • -r :删除目前的定时服务。
  • -l :查看目前的定时服务。

周期性地执行某任务 :

       cron : 自身是一个不间断运行的服务;

       anacron : cron的补充,能够实现让cron因为各种原因在过去的时间该执行而未执行的任务在恢复正常执行一次;

时程表基本格式

* * * * * command
分 时 日 月 周 命令

  • 第1列分钟0~59

  • 第2列小时0~23(0表示子夜)

  • 第3列日1~31

  • 第4列月1~12

  • 第5列星期0~7(0和7表示星期天)

  • 第6列是要运行的命令

 

cron的种类 : 

    系统cron任务 : 

              /etc/crontab                 #系统cron任务所在目录

                     分钟    小时   天   月    周   用户   任务

    用户cron任务 : 

              /var/spool/cron/USERNAME                 #系统cron任务所在目录

                     分钟    小时   天   月    周   任务

时间的有效取值 : 

           分钟 : 0-59

           小时 : 0-23

            天  : 1-31

            月 : 1-12

            周 : 0-7 ,0和7都表示周日           

时间通配表示 : 

           * : 对应时间的所有有效取值

                 3 * * * * 

                 3 * * * *7

                 3 * * * 6 7 

         , : 离散时间点 : 

              10,20 * * 2,5                  #周二和周五,每隔10分钟,20分钟执行一次

         -: 连续时间点 : 

              10,20 * * 2-5                     #周二到周五,每隔10分钟,20分钟执行一次

     每两个小时执行一次 : 

              08 */2 * * *

     每两天执行一次 :

              08  04 */2 * *

执行结果将以邮件形式发送给管理员

              */3 * * * * cat /etc/fstab &> /dev/null     

 

每天两点,备份zabbix mysql discuz数据库。

#crontab -e

0 2 * * * sh auto_backup_mysql.sh zabbix mysql discuz >>/tmp/backup.log 2>&1

#crontab -l

五个星号 表示 : 天、小时、日 、月、星期、

2>&1     表示 :标准输出。

 

案例 : 

1、脚本位置:/search/odin/mailauto/sele.py
我要设置每周一到周五下午两点执行该脚本,命令如下:

00 14 * * 1-5 python3 /search/odin/mailauto/sele.py

使用命令crontab–e,打开crontab文件,将命令保存。
之后重启crontab服务就生效了,重启命令:

/usr/sbinservicecrond restart

 

2、SHELL=/bin/bash

PATH=/sbin:/user/Sbin:/usr/sbin

MAILTO=root

HOME=/

 

# run-parts

01 * * * * root run-parts /etc/cron.hourly                   #每一分钟执行的结果,反馈给……

02 4 * * * root run-parts /etc/cron.daily                       #每天4点02,将执行的结果,反馈给……

02 4 * * 0 root run-parts /etc/cron.weekly                   #每周……

02 4 1 * * root run-parts /etc/cron.monthly                   #每月……

 

 cron的环境变量 : cron执行所有命令都去PATH环境变量指定的路径下去找

       PATH /bin:/sbin:/user/bin:/usr/sbin

 

用户任务的管理 : 

      crontab 命令: 

                   -l : 列出当前用户的所有cron任务

                   -e : 编辑

                   -r : 移除所有cron任务

                   -u USERNAME : 管理其用户的cron任务

 

一、cron服务

cron是一个linux下 的定时执行工具,可以在无需人工干预的情况下运行作业。

service crond start         //启动服务
service crond stop          //关闭服务
service crond restart       //重启服务
service crond reload        //重新载入配置
service crond status        //查看服务状态

 

二、cron的配置文件:

/var/spool/cron/ 这个目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名,比如tom建的crontab任务对应的文件就是/var/spool/cron/tom。一般一个用户最多只有一个crontab文件。

 

三、/etc/crontab 这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
 

 

 # 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

 

MAILTO=root:是说,当 /etc/crontab 这个档案中的例行性命令发生错误时,会将错误讯息或者是屏幕显示的讯息传给谁?由于 root 并无法再用户端收信,因此,我通常都將这个 e-mail 改成自己的账号,好让我随时了解系统的状态!

01 * * * * root run-parts /etc/cron.hourly:在 #run-parts 这一行以后的命令,我们可以发现,五个数字后面接的是 root ,这一行代表的是『执行的级别为root身份』当然,你也可以将这一行改为成其他的身份!而 run-parts代表后面接的 /etc/cron.hourly 是『一个目录内(/etc/cron.hourly)的所有可执行文件』,也就是说,每个小时的01分,系统会以root身份去/etc/cron.hourly这个目录下执行所有可执行的文件!后面三行也是类似的意思!你可以到 /etc/ 底下去看看,系统本来就预设了这4个目录!你可以将每天需要执行的命令直接写到/etc/cron.daily即可,还不需要使用到crontab -e的程式!

 

四、/etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。

Linux下的计划任务--crontabLinux下的计划任务--crontab

  1. MAILTO=root:是说,当 /etc/crontab 这个档案中的例行性命令发生错误时,会将错误讯息或者是屏幕显示的讯息传给谁?由于 root 并无法再用户端收信,因此,我通常都將这个 e-mail 改成自己的账号,好让我随时了解系统的状态!

  2. 01 * * * * root run-parts /etc/cron.hourly:在 #run-parts 这一行以后的命令,我们可以发现,五个数字后面接的是 root ,这一行代表的是『执行的级别为root身份』当然,你也可以将这一行改为成其他的身份!而 run-parts代表后面接的 /etc/cron.hourly 是『一个目录内(/etc/cron.hourly)的所有可执行文件』,也就是说,每个小时的01分,系统会以root身份去/etc/cron.hourly这个目录下执行所有可执行的文件!后面三行也是类似的意思!你可以到 /etc/ 底下去看看,系统本来就预设了这4个目录!你可以将每天需要执行的命令直接写到/etc/cron.daily即可,还不需要使用到crontab -e的程式!

 

五、权限

crontab权限问题到/var/adm/cron/下一看,文件cron.allow和cron.deny是否存在
用法如下:
1、如果两个文件都不存在,则只有root用户才能使用crontab命令。
2、如果cron.allow存在但cron.deny不存在,则只有列在cron.allow文件里的用户才能使用crontab命令,如果root用户也不在里面,则root用户也不能使用crontab。
3、如果cron.allow不存在, cron.deny存在,则只有列在cron.deny文件里面的用户不能使用crontab命令,其它用户都能使用。
4、如果两个文件都存在,则列在cron.allow文件中而且没有列在cron.deny中的用户可以使用crontab,如果两个文件中都有同一个用户,以cron.allow文件里面是否有该用户为准,如果cron.allow中有该用户,则可以使用crontab命令。

AIX 中 普通用户默认都有 crontab 权限,如果要限制用户使用 crontab ,就需要编辑/var/adm/cron/cron.deny
HP-UNIX 中默认普通用户没得crontab 权限 ,要想放开普通用户的crontab 权限可以编

 

六、创建cron脚本

第一步:写cron脚本文件,命名为crontest.cron。

 15,30,45,59 * * * * echo "xgmtest....." >> xgmtest.txt 表示,每隔15分钟,执行打印一次命令

 

第二步:添加定时任务。执行命令 “crontab crontest.cron”。搞定
第三步:"crontab -l" 查看定时任务是否成功或者检测/var/spool/cron下是否生成对应cron脚本

注意:这操作是直接替换该用户下的crontab,而不是新增

 

七、crontab用法

crontab命令用于安装、删除或者列出用于驱动cron后台进程的表格。用户把需要执行的命令序列放到crontab文件中以获得执行。
每个用户都可以有自己的crontab文件。/var/spool/cron下的crontab文件不可以直接创建或者直接修改。该crontab文件是通过crontab命令创建的

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

 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)

 

除了数字还有几个个特殊的符号就是""、"/"和"-"、",",代表所有的取值范围内的数字,"/"代表每的意思,"/5"表示每5个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。

-l 在标准输出上显示当前的crontab。
-r 删除当前的crontab文件。
-e 使用VISUAL或者EDITOR环境变量所指的编辑器编辑当前的crontab文件。当结束编辑离开时,编辑后的文件将自动安装。

八、例子:

每天早上6点

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

crontab每10秒钟执行一次

* * * * * sleep 10; /bin/date >>/tmp/date.txt
* * * * * sleep 20; /bin/date >>/tmp/date.txt
* * * * * sleep 30; /bin/date >>/tmp/date.txt
* * * * * sleep 40; /bin/date >>/tmp/date.txt
* * * * * sleep 50; /bin/date >>/tmp/date.txt

跟踪日志,可以看到是每10秒钟执行一次。

tail -f date.txt 
Thu Mar 9 16:00:12 CST 2017
Thu Mar 9 16:00:22 CST 2017
Thu Mar 9 16:00:32 CST 2017
Thu Mar 9 16:00:42 CST 2017

每两个小时

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

每秒钟执行,

* * * * * sleep 1 ; /bin/date >>/tmp/date.txt 
* * * * * sleep 2 ; /bin/date >>/tmp/date.txt 
* * * * * sleep 3 ; /bin/date >>/tmp/date.txt 
* * * * * sleep 4 ; /bin/date >>/tmp/date.txt 

使用脚本运行

#!/bin/bash

step=2 #间隔的秒数,不能大于60

for (( i=0; i<60; i=(i+step) )); do
date
sleep $step
done

exit 0

使用脚本运行

#!/bin/bash

step=2 #间隔的秒数,不能大于60

for (( i=0; i<60; i=(i+step) )); do
date
sleep $step
done

exit 0

添加到crontab中

crontab -l
* * * * * sh /root/crontab.sh >> /tmp/crontab.log

查看日志

tail -f tail -f /tmp/crontab.log

crontab -l
* * * * * sh /root/crontab.sh >> /tmp/crontab.log

 

查看日志

tail -f tail -f /tmp/crontab.log

 

每天凌晨3:10执行全量备份

10 3 * * 0-6 /opt/soft/scripts/mysqldaiybak.sh

 

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

 0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt

 

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

 0 11 4 * 1-3 command line

 

表示每晚的21:30重启apache

30 21 * * * /usr/local/etc/rc.d/lighttpd restart 

表示每月1、10、22日的4 : 45重启apache。 

5 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart 
 

表示每周六、周日的1 : 10重启apache。

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart 

表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。 

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart 

 

表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。 

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart

 

每月的4号与每周一到周三的11点重启smb 

0 11 4 * mon-wed /etc/init.d/smb restart

一月一号的4点重启smb 

0 4 1 jan * /etc/init.d/smb restart

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

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

说明:
run-parts这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是目录名了

 

每一小时重启apache 

0 */1 * * * /usr/local/etc/rc.d/lighttpd restart 

晚上11点到早上7点之间,每隔一小时重启apache 

0 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart 

 

晚上11点到早上7点之间,每隔一小时重启apache 
0 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart 

 

每周一到周五的11:41开始,每隔10分钟执行一次

41,51 11 * * 1-5   root /home/www.osyunwei.com/osyunwei.sh

1-59/10 12-23 * * 1-5   root /home/www.osyunwei.com/osyunwei.sh

 

在每天的10:31开始,每隔2小时重复一次

31 10-23/2 * * * root   /home/www.osyunwei.com/osyunwei.sh

每周一到周五8:00,每周一到周五9:00

0 8,9 * * 1-5  root /home/www.osyunwei.com/osyunwei.sh

 

每月的4号与每周一到周三的11点重启apache 

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart 

 

每周一到周五9:25到11:35之间、13:00到15:00之间,每隔10分钟运行一次

25,35,45,55  9 * * 1-5  root   /home/www.osyunwei.com/osyunwei.sh

5-59/10  10 * * 1-5  root   /home/www.osyunwei.com/osyunwei.sh

5,15,25,35  11 * * 1-5  root   /home/www.osyunwei.com/osyunwei.sh

*/10  13-15 * * 1-5  root   /home/www.osyunwei.com/osyunwei.sh

 

每周一到周五8:30、8:50、9:30、10:00、10:30、11:00、11:30、13:30、14:00、14:30、5:00分别执行一次

30,50 8 * * 1-5  root  /home/www.osyunwei.com/osyunwei.sh

30 9 * * 1-5  root  /home/www.osyunwei.com/osyunwei.sh

*/30 10-11 * * 1-5  root  /home/www.osyunwei.com/osyunwei.sh

30 13 * * 1-5  root  /home/www.osyunwei.com/osyunwei.sh

0,30 14-15 * * 1-5  root  /home/www.osyunwei.com/osyunwei.sh

 

 

在下午4 :50删除/abc目录下的全部子目录和全部文件;

50 16 * * * root rm -rf /abc/* 2>&1 &

从早8:00~下午6:00每小时读取/xyz目录下x1文件中每行第一个域的全部数据加入到/backup目录下的bak01.txt文件内;

)00 8-18 * * * root cat /xyz/x1|awk '{print $1}' >> /backup/bak01.txt 2>&1 &

每逢星期一下午5:50将/data目录下的所有目录和文件归档并压缩为文件:backup.tar.gz;

50 17 * * 1 root cd /data;tar -zcvf backup.tar.gz * 2>&1 &

 

在下午5:55将IDE接口的CD-ROM卸载(假设:CD-ROM的设备名为hdc);

55 17 * * * root umount /hdc 2>&1 &

 

服务操作说明:

chkconfig crond on  #设为开机启动,先要安装chkconfig(yum install chkconfig)

/sbin/service crond start                             //启动服务

/sbin/service crond stop                             //关闭服务

/sbin/service crond restart                          //重启服务

/etc/rc.d/init.d/crond restart                       #重启

/etc/rc.d/init.d/crond reload                        #不中断服务,重新载入配置

/sbin/service crond reload                          //重新载入配置

/sbin/service crond status                          //启动服务

 

在早晨8:00前开机后启动 --> 这个我不是很明白它的意思,不知道是不是8点前开机就启动上面的设定,8点后才开机就不用启动的意思。姑且用下面这个命令吧。

chkconfig --level 2345 crond on

 

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

8-22点:每2分钟执行

7-8和23点:每10分钟执行一次

0-6点:每1 小时执行一次

*/2 8-22 * * * root /usr/bin/python /home/abc.py >>/data/logs/abc.log
9,19,29,39,49,59 7-8,23 * * * root /usr/bin/python /home/abc.py >>/data/logs/abc.log
59 0-6 * * * root /usr/bin/python /home/abc.py >>/data/logs/abc.log
 

每月去执行/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这个指令:

 12,55 3 4-9 1,4 * /bin/rm -f expire.1st

 

每周末的凌晨一点钟执行一次系统的raid-check

0 1 * * Sun root /usr/sbin/raid-check

 

每天的4:02am分root用户执行/etc/cron.daily目录下的所有脚本,run-parts参数表示执行后面目录中的所有脚本。

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

 

每天的8-18每四小时,dodmaster用户执行hislogclear.sh脚本,即8:44,12:44,16:44,20:44四个时间点,会执行该脚本。

[21:57:56][dodmaster@mha3 ~]$ crontab -l
44 8-20/4 * * * $HOME/.DailyShell/hislogclear.sh

 

每五分钟执行一次

*/5 * * * * echo "every five minute to do it" >> time.txt

  

每个工作日下午八点执行

0 20 * * 1-5 echo "every workday 20:00 to do it" >> time.txt

 

每分钟的30秒时执行,因为cron服务是每分钟被唤醒一次,所以要执行精确到秒的任务需要借助sleep命令。

* * * * * sleep 30; echo "every minute 30 second to do it" >> time.txt

 

每20秒执行一次,即表示在每分钟的0秒、20秒、40秒各执行一次(也可以是其他的步长是20秒的值,例如:5s、25s、45s)

* * * * * echo "every 20 second to do it" >> time.txt
* * * * * sleep 20; echo "every 20 second to do it" >> time.txt
* * * * * sleep 40; echo "every 20 second to do it" >> time.txt

 

使用案例  : 

1、配置本机每隔两天在凌晨3点20备份一次/etc目录,备份文件存放至/backup/etc/目录,文件名称如 : etc-2012-06-20.tar.bz2;

答  : 

20 3 */2 * *   cp /etc/ etc-2012-06-20.tar.bz2;                         #

 

2、CentOS系统时间与UTC时间不一致的解决方法

CentOS Linux中终端命令中执行以下命令:

1、vi /etc/sysconfig/clock   #编辑时间配置文件

     ZONE="Asia/Shanghai"
     UTC=false                          #设置为false,硬件时钟不于utc时间一致
     ARC=false

2、ln -sf /usr/share/zoneinfo/Asia/Shanghai    /etc/localtime    #linux的时区设置为上海时区

3、ntpdate 192.43.244.18    #对准时间

如果没有安装ntp服务器,刚需要先执行以下命令:

yum install ntp #安装ntp服务器

 

4、/sbin/hwclock --systohc   #设置硬件时间和系统时间一致并校准

好了,我们的CentOS linux系统时间和计算机硬件时间终于都是cst时间了,并且都是上海时区,终于是正常啦。

 

5、在 11 月份内,每天的早上 6 点到 12 点中,每隔 2 小时执行一次/usr/bin/httpd.sh 怎么
实现
0 6-12/2 * 11 * /usr/bin/httpd.sh

 

6、有一普通用户想在每周日凌晨零点零分定期备份/user/backup 到/tmp 目录下,该用
户应如何做?
参考答案:(1)第一种方法:
用户应使用 crontab –e 命令创建 crontab 文件。格式如下:
0 0 * * sun cp –r /user/backup /tmp
(2)第二种方法:
用户先在自己目录下新建文件 file,文件内容如下:
0 * * sun cp –r /user/backup /tmp
然后执行 crontab file 使生效。

 

7、系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决 方案 :
(1)在下午 4 :50 删除/abc 目录下的全部子目录和全部文件;
(2)从早 8:00~下午 6:00 每小时读取/xyz 目录下 x1 文件中每行第一个域的全部数据
加入到/backup 目录下的 bak01.txt 文件内;
(3)每逢星期一下午 5:50 将/data 目录下的所有目录和文件归档并压缩为文件:
backup.tar.gz;
(4)在下午 5:55 将 IDE 接口的 CD-ROM 卸载(假设:CD-ROM 的设备名为 hdc);
(5)在早晨 8:00 前开机后启动。
参考答案:
解决方案:
(1)、用 vi 创建编辑一个名为 prgx 的 crontab 文件;
prgx 文件的内容:
50 16 * * * rm -r /abc/*
(2)、0 8-18/1 * * * cut -f1 /xyz/x1 >;>; /backup/bak01.txt
(3)、50 17 * * * tar zcvf backup.tar.gz /data
(4)、55 17 * * * umount /dev/hdc
(5)、由超级用户登录,用 crontab 执行 prgx 文件中的内容:
root@xxx:#crontab prgx;在每日早晨 8:00 之前开机后即可自动启动 crontab

 

8、crontab异常未执行原因

近期碰到个问题,服务器上线后,crontab都发生异常没有自动执行,查看了下日志,发现问题:

Apr 16 11:26:01 imysql.cn crond[28354]: (*system*) BAD FILE MODE (/etc/cron.d/flushhost)
Apr 16 11:26:01 imysql.cn crond[28354]: (root) BAD FILE MODE (cron/root)

检查了下 /etc/cron.d/ 目录下的其他文件,发现 flushhost 的属性是 755,其他的则是 644,于是将这个脚本属性也改成644,问题解决。

另外,还同时修改了mysql安装包的install.sh脚本,新服安装完毕后,修改flushhost脚本的属性为644。

这个问题貌似只在个别版本的RHEL下碰到过,并不是所有的版本都有。

 

9、设置任务计划

/home/www.osyunwei.com/osyunwei.sh              #要自动执行的脚本程序路径

chmod +x /home/www.osyunwei.com/osyunwei.sh   #对脚本文件添加执行权限,否则不能执行

vi /etc/crontab                 #编辑配置文件,在最后一行添加内容

30 1 * * * root /home/www.osyunwei.com/osyunwei.sh              #表示每天凌晨1点30执行备份

:wq!          #保存退出

/etc/rc.d/init.d/crond restart       #重启

 

10、保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局。

1)脚本中涉及文件路径时写全局路径;

2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:

cat start_cbp.sh

#!/bin/sh

source /etc/profile

export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf

/usr/local/jboss-4.0.5/bin/run.sh -c mev &

3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:

0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

注意清理系统用户的邮件日志
每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。

例如,可以在crontab文件中设置如下形式,忽略日志输出:

0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。

 

11、

 

12、

 

13、

 

14、

 

15、

 

16、

 

17、

 

18、

 

19、

 

20、

 

21、

 

22、

 

23、

 

 

24、

 

25、

 

 

 

链接 : 

Centos下crontab指定执行用户  : https://www.jb51.net/os/RedHat/517715.html

CentOS下如何实行计划任务?CentOS下实行计划任务的方法 : https://www.jb51.net/os/RedHat/517610.html

Linux下使用crontab定时备份MYSQL数据库   :  https://www.jianshu.com/p/c32e53d2cd2d

Linux之crontab定时任务   :  https://www.jianshu.com/p/838db0269fd0

linux使用find和crontab命令定期清理过期文件 : https://www.jb51.net/article/100538.htm

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!