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小时发送一封电子邮件。

三、不执行常见原因

  1. crond服务未启动
    crontab不是Linux内核的功能,而是依赖一个crond服务,这个服务可以启动当然也可以停止。如果停止了就无法执行任何定时任务了,解决的方法是打开它:
    crond

    service crond start
    如果提示crond命令不存在,可能被误删除了,CentOS下可以通过这个命令重新安装:
    yum -y install crontabs
  2. 权限问题
    比如:脚本没有x执行权限,解决方法:
    增加执行权限,或者用bash abc.sh的方法执行
    也有可能crontab任务所属的用户对某个目录没有写权限,也会失败
  3. 路径问题
    有的命令在shell中执行正常,但是在crontab执行却总是失败。有可能是因为crontab使用的sh未正确识别路径,比如:以root身份登录shell后执行一个/root/test.sh,只要执行
    ./test.sh
    就可以了。但是在crontab中,就会找不到这个脚本,比如写完整:
    /root/test.sh
  4. 时差问题
    因为服务器与客户端时差问题,所以crontab的时间以服务器时间为准。
    时差这个问题还真是搞人,这个我亲身体验了,现象如下:
    (1) 我设置了一个定时脚本,用date命令观察服务器的时间到了脚本执行的时间点,发现没有执行
    (2) 但是我把脚本设置成每分钟执行一次,就是OK的
    见鬼了,服务器时间是对的啊?莫非是要加个什么时区?于是把脚本的时间减10或者12或者8个小时都尝试了下,发现都不行。
    但是很明显是时间不一致导致的不执行。
    最后用如下两行解决了问题:

    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    service crond restart
  5. 变量问题
    有时候命令中含有变量,但crontab执行时却没有,也会造成执行失败。

四、开启cron日志

  1. 开启cron日志
    ubuntu默认没有开启cron日志记录
  2. 修改rsyslog
    sudo vim /etc/rsyslog.d/50-default.conf
    cron.* /var/log/cron.log #将cron前面的注释符去掉
  3. 重启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