linux下crontab使用方法
一、常用的cron命令:
启动/etc/init.d/crond start
关闭/etc/init.d/crond stop
重启/etc/init.d/crond restart
有的系统可能init.d目录下没有crond,只有cron,其实也一样,只不过把crond换为cron:
启动/etc/init.d/cron start
关闭/etc/init.d/cron stop
重启/etc/init.d/cron restart
判断crond 是否在运行:pgrep crond或者pgrep cron,如果有在运行则返回进程号。
杀掉crond进程:pkill crond或者pkill cron,此法可用在关闭或重启不了cron的时候。
配置cron定时任务:crontab -e,配置文件路径一般为/var/spool/cron/crontabs/root
这个是root用户的配置文件,其它用户是对应的用户名命名的文件,所以配置定时任务也可以vi /var/spool/cron/crontabs/root
后面会讲如何添加定时任务。
配置指定用户的配置文件
crontab -u<用户名称>
查看配置文件:crontab –l
二、下面讲如何配置定时任务
基本格式 :
* * * * * command
几个星号分别为:分 时 日 月 周,最后是要执行的命令。
分:0~59
时:0~23
日:1~31
月:1~12
周:0~6(0表示星期天)
配置文件的一些例子:
0 3 * * * /root/test.sh 每天凌晨3点执行test.sh文件
* 23-7/1 * * * /root/lnmp restart 晚上11点到早上7点之间,每隔一小时重启lnmp套件
*/30 * * * * /usr/sbin/ntpdate 每半小时同步一下时间
0 23 * * 6 /lnmp restart 每星期六的11 : 00 pm重启重启lnmp套件。
* */1 * * * /usr/bin/mutt -s “hello” i@lizhongyi.com </home/content.txt 每隔1小时发送一封电子邮件。
三、不执行常见原因
- crond服务未启动
crontab不是Linux内核的功能,而是依赖一个crond服务,这个服务可以启动当然也可以停止。如果停止了就无法执行任何定时任务了,解决的方法是打开它:
crond
或
service crond start
如果提示crond命令不存在,可能被误删除了,CentOS下可以通过这个命令重新安装:
yum -y install crontabs - 权限问题
比如:脚本没有x执行权限,解决方法:
增加执行权限,或者用bash abc.sh的方法执行
也有可能crontab任务所属的用户对某个目录没有写权限,也会失败 - 路径问题
有的命令在shell中执行正常,但是在crontab执行却总是失败。有可能是因为crontab使用的sh未正确识别路径,比如:以root身份登录shell后执行一个/root/test.sh,只要执行
./test.sh
就可以了。但是在crontab中,就会找不到这个脚本,比如写完整:
/root/test.sh - 时差问题
因为服务器与客户端时差问题,所以crontab的时间以服务器时间为准。
时差这个问题还真是搞人,这个我亲身体验了,现象如下:
(1) 我设置了一个定时脚本,用date命令观察服务器的时间到了脚本执行的时间点,发现没有执行
(2) 但是我把脚本设置成每分钟执行一次,就是OK的
见鬼了,服务器时间是对的啊?莫非是要加个什么时区?于是把脚本的时间减10或者12或者8个小时都尝试了下,发现都不行。
但是很明显是时间不一致导致的不执行。
最后用如下两行解决了问题:cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime service crond restart
- 变量问题
有时候命令中含有变量,但crontab执行时却没有,也会造成执行失败。
四、开启cron日志
- 开启cron日志
ubuntu默认没有开启cron日志记录 - 修改rsyslog
sudo vim /etc/rsyslog.d/50-default.conf
cron.* /var/log/cron.log #将cron前面的注释符去掉 - 重启rsyslog
sudo service rsyslog restart
就可以查看运行时的日志文件,如果在日志文件中出现:No MTA installed, discarding output
那么就是说,crontab执行脚本时是不会直接错误的信息输出,而是会以邮件的形式发送到你的邮箱里,这时候就需要邮件服务器了,如果你没有安装邮件服务器,它就会报这个错。如果是测试,可以用下面的办法来解决:
在每条定时脚本后面加入:
>/dev/null 2>&1
参考:
https://www.cnblogs.com/cobobryan/archive/2013/01/09/2852628.html
https://www.imooc.com/article/12662