通过 crontab 命令,咱们能够在固定的间隔时间执行指定的零碎指令或 shell script 脚本。工夫距离的单位能够是分钟、小时、日、月、周及以上的任意组合。这个命令非常适合周期性的日志剖析或数据备份等工作。
> systemctl start/stop/restart/status cron
命令格局
crontab [-u user] file
crontab [-u user] {-e | -l | -r}
命令参数
- -u user:用来设定某个用户的 crontab 服务;
- file:file 是命令文件的名字, 示意将 file 做为 crontab 的工作列表文件并载入 crontab。如果在命令行中没有指定这个文件,crontab 命令将承受规范输出(键盘)上键入的命令,并将它们载入 crontab。
- -e:编辑某个用户的 crontab 文件内容。如果不指定用户,则示意编辑以后用户的 crontab 文件。
- -l:显示某个用户的 crontab 文件内容,如果不指定用户,则示意显示以后用户的 crontab 文件内容。
- -r:从
/var/spool/cron
目录中删除某个用户的 crontab 文件,如果不指定用户,则默认删除以后用户的 crontab 文件。 - -i:在删除用户的 crontab 文件时给确认提醒。
crontab 的文件格式
字段 | 形容 | 容许的值 |
---|---|---|
分钟 | 一小时的第几分 | 0-59 |
小时 | 一天的第几小时 | 0-23 |
日期 | 一个月的的第几天 | 1-31 |
月份 | 一年的第几个月 | 1-12 |
周几 | 一周的第几天 | 0-6 |
命令 | 命令 | 能够被执行的任何命令 |
罕用办法
创立一个新的 crontab 文件, 向 cron 过程提交一个 crontab 文件之前,首先要设置环境变量 EDITOR。cron 过程依据它来确定应用哪个编辑器编辑 crontab 文件。99% 的 UNIX 和 LINUX 用户都应用 vi,如果你也是这样,那么你就编辑 $HOME 目录下的. profile 文件,在其中退出这样一行
EDITOR=vi; export EDITOR
而后保留并退出。无妨创立一个名为 <user> cron 的文件,其中 <user> 是用户名,例如,davecron。在该文件中退出如下的内容。
# (put your own initials here)echo the date to the console every
# 15minutes between 6pm and 6am
0,15,30,45 18-06 * * * /bin/echo 'date' > /dev/console
保留并退出。留神后面 5 个域用空格分隔。
在下面的例子中,零碎将每隔 1 5 分钟向控制台输入一次以后工夫。如果零碎解体或挂起,从最初所显示的工夫就能够一眼看出零碎是什么工夫进行工作的。在有些零碎中,用 tty1 来示意控制台,能够依据理论状况对下面的例子进行相应的批改。为了提交你刚刚创立的 crontab 文件,能够把这个新创建的文件作为 cron 命令的参数 $ crontab davecron
当初该文件曾经提交给 cron 过程,它将每隔 1 5 分钟运行一次。同时,新创建文件的一个正本曾经被放在 /var/spool/cron 目录中,文件名就是用户名(即 dave)。
应用 - l 参数列出 crontab 文件::
> crontab -l
0,15,30,45 18-06 * * * /bin/echo `date` > dev/tty1
能够应用这种办法在 $HOME 目录中对 crontab 文件做一备份::
$ crontab -l > $HOME/mycron
这样,一旦不小心误删了 crontab 文件,能够用上一节所讲述的办法迅速复原。
如果心愿增加、删除或编辑 crontab 文件中的条目,而 EDITOR 环境变量又设置为 vi,那么就能够用 vi 来编辑 crontab 文件
crontab -e
能够像应用 vi 编辑其余任何文件那样批改 crontab 文件并退出。如果批改了某些条目或增加了新的条目,那么在保留该文件时,cron 会对其进行必要的完整性检查。如果其中的某个域呈现了超出容许范畴的值,它会提醒你。咱们在编辑 crontab 文件时,没准会退出新的条目。例如,退出上面的一条:
# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
30 3 1,7,14,21,26 * * /bin/find -name 'core' -exec rm {} \;
最好在 crontab 文件的每一个条目之上退出一条正文,这样就能够晓得它的性能、运行工夫,更为重要的是,晓得这是哪位用户的定时作业。
删除 crontab 文件
crontab -r
每 1 分钟执行一次 cmd
* * * * * cmd
每小时的第 3 和第 15 分钟执行
3,15 * * * * cmd
在上午 8 点到 11 点的第 3 和第 15 分钟执行
3,15 8-11 * * * cmd
每隔两天的上午 8 点到 11 点的第 3 和第 15 分钟执行
3,15 8-11 */2 * * cmd
每周一上午 8 点到 11 点的第 3 和第 15 分钟执行
3,15 8-11 * * 1 cmd
每晚的 21:30 重启 smb
30 21 * * * /etc/init.d/smb restart
每月 1、10、22 日的 4 : 45 重启 smb
45 4 1,10,22 * * /etc/init.d/smb restart
每周六、周日的 1 : 10 重启 smb
10 1 * * 6,0 /etc/init.d/smb restart
每天 18 : 00 至 23 : 00 之间每隔 30 分钟重启 smb
0,30 18-23 * * * /etc/init.d/smb restart
每星期六的早晨 11 : 00 pm 重启 smb
0 23 * * 6 /etc/init.d/smb restart
每一小时重启 smb
0 */1 * * * /etc/init.d/smb restart
早晨 11 点到早上 7 点之间,每隔一小时重启 smb
0 23-7 * * * /etc/init.d/smb restart
应用注意事项
留神环境变量问题
有时咱们创立了一个 crontab,然而这个工作却无奈主动执行,而手动执行这个工作却没有问题,这种状况个别是因为在 crontab 文件中没有配置环境变量引起的。
在 crontab 文件中定义多个调度工作时,须要特地注环境变量的设置,因为咱们手动执行某个工作时,是在以后 shell 环境下进行的,程序当然能找到环境变量,而零碎主动执行任务调度时,是不会加载任何环境变量的,因而,就须要在 crontab 文件中指定工作运行所需的所有环境变量,这样,零碎执行任务调度时就没有问题了。
不要假设 cron 晓得所须要的非凡环境,它其实并不知道。所以你要保障在 shelll 脚本中提供所有必要的门路和环境变量,除了一些主动设置的全局变量。所以留神如下 3 点:
- 脚本中波及文件门路时写全局门路;
- 脚本执行要用到 java 或其余环境变量时,通过 source 命令引入环境变量,如::
cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/rumenz
/usr/local/temp/bin/run.sh -c mev &
- 当手动执行脚本 OK,然而 crontab 死活不执行时, 很可能是环境变量惹的祸,可尝试在 crontab 中间接引入环境变量解决问题。如::
0 * * * * /etc/profile;/bin/sh /var/www/java/bin/restart_audit.sh
留神清理零碎用户的邮件日志
每条任务调度执行结束,零碎都会将工作输入信息通过电子邮件的模式发送给以后零碎用户,这样与日俱增,日志信息会十分大,可能会影响零碎的失常运行,因而,将每条工作进行重定向解决十分重要。
例如,能够在 crontab 文件中设置如下模式,疏忽日志输入::
0 */3 * * * /usr/local/bin/apachectl restart >/dev/null 2>&1
/dev/null 2>&1
示意先将规范输入重定向到/dev/null
,而后将规范谬误重定向到规范输入,因为规范输入曾经重定向到了/dev/null
,因而规范谬误也会重定向到/dev/null
,这样日志输入问题就解决了。
零碎级任务调度与用户级任务调度
零碎级任务调度次要实现零碎的一些保护操作,用户级任务调度次要实现用户自定义的一些工作,能够将用户级任务调度放到零碎级任务调度来实现(不倡议这么做),然而反过来却不行,root 用户的任务调度操作能够通过
crontab –uroot –e
来设置,也能够将调度工作间接写入/etc/crontab
文件,须要留神的是,如果要定义一个定时重启零碎的工作,就必须将工作放到/etc/crontab
文件,即便在 root 用户下创立一个定时重启零碎的工作也是有效的。
原文链接:https://rumenz.com/rumenbiji/…
微信公众号: 入门小站