共计 2190 个字符,预计需要花费 6 分钟才能阅读完成。
导读 | crond 是 linux 下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与 windows 下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动 crond 进程,crond 进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。Linux 下的任务调度分为两类,系统任务调度和用户任务调度。系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在 /etc 目录下有一个 crontab 文件,这个就是系统任务调度的配置文件。 |
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# .—————- 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
# | | | | |
# m h dom mon dow command
# * * * * * command will be executed
例如:
*/5 * * * * root /usr/libexec/atrun
minute(m):代表一小时内的第几分,范围 0-59。
hour(h):代表一天中的第几小时,范围 0-23。
mday(dom):代表一个月中的第几天,范围 1-31。
month(mon):代表一年中第几个月,范围 1-12。
wday(dow):代表星期几,范围 0-7 (0 及 7 都是星期天)。
who:要使用什么身份执行该指令,当您使用 crontab -e 时,不必加此字段。
command(command):所要执行的指令。
/etc/init.d/crond help
Usage: /etc/init.d/crond {start|stop|status|restart|condrestart|try-restart|reload|force-reload}
chkconfig crond on
crontab 定时任务不执行问题
排查原因步骤如下:
首先,确认服务器是否开启定时任务计划服务,只有 root 用户才能对 crond 服务进行开启和关闭
[root@mimvp-bj script]# service crond status
crond is stopped
[root@mimvp-bj script]# service crond start
Starting crond: [OK]
[root@mimvp-bj script]# service crond status
crond (pid 24577) is running…
请确保 crond 状态为 is running…
如果 crond 状态为 crond is stopped,则定时任务服务不会生效故无法执行,我遇到的 crontab 不执行就是这个原因
编辑 crontab:
crontab -e
# m h dom mon dow command
SHELL=/bin/bash
30 * * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh
Ctrl + O(写入)——》Enter 键(保存文件名)——》Ctrl + X(退出)
输入查看命令:
crontab -l
# m h dom mon dow command
SHELL=/bin/bash
30 * * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh(推荐用此方式)
Syntax error: "(" unexpected
解决方法:
需指定 shell 解释器命令:SHELL=/bin/bash(请参见上面 crontab 编辑示例 SHELL=/bin/bash)
或者参见:LINUX – BASH Syntax Error
在 /var/spool/crontab/yanggang 中,添加了如下命令,在日志文件 /var/spool/mail/yanggang 中提示找不到 xxx.sh 路径
30 * * * * /home/barry/top800/top10/top10_fruits/top10_all.sh
或
30 * * * * bash /home/barry/top800/top10/top10_fruits/top10_all.sh
这是因为你在 crontab 中使用了绝对路径执行脚本 top10_all.sh,因此在脚本 top10_all.sh 中引用的其它脚本也都需要使用绝对路径,才能被 crontab 找到并执行。
那么该如何避免绝对路径呢,推荐采用如下格式:
30 * * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh(推荐用此方式)
先进入该目录,然后在执行脚本;否则,执行脚本中的其它脚本都需要加绝对路径