自己在编写crontab时遇到了一点坑,花了好久时间,所以记录下来。
定时任务文件位置
/etc/crontab
注意事项:
1.commands命令中,用到的路径最好是全路径噢!
2.最好将要执行的定时任务放到一个.sh文件中,然后在.sh文件的开头添加以下代码。
①首先在控制台执行$PATH,以下是我的结果
bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/jvm/java-8-oracle/bin:/usr/lib/jvm/java-8-oracle/db/bin:/usr/lib/jvm/java-8-oracle/jre/bin:/usr/local/software/android-sdk/tools:/usr/local/software/android-sdk/platform-tools:/usr/local/software/nodejs/node-v6.11.0-linux-x64/bin
②然后打开你用来存放定时任务的.sh文件,在开头添加
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/jvm/java-8-oracle/bin:/usr/lib/jvm/java-8-oracle/db/bin:/usr/lib/jvm/java-8-oracle/jre/bin:/usr/local/software/android-sdk/tools:/usr/local/software/android-sdk/platform-tools:/usr/local/software/nodejs/node-v6.11.0-linux-x64/bin
为什么要加这些呢?
因为你可以打开/etc/crontab,查看到最上面的path的值
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
你可以发现,crontab定时任务执行时的PATH只有这么几个目录,而你的定时任务中,很有可能有一些指令,例如:adb,是不在path之内,所有如果直接执行定时任务,就会报错。因此,需要export PATH。(一种方式是直接修改etc/crontab文件中的PATH值;另一种是将定时任务放到脚本文件中,然后在文件的最上方export PATH = 。。。提倡后者噢)
如何查看定时任务出错报告呢?
1.重定向错误信息到指定的文件(推荐)
*/1 * * * * root commond > /root/err.log 2>&1
这里的意思是将指令执行的错误信息,重定向到/root/err.log文件中。
2.启动cron.log文件
网上很多都是通过这种方式,但是,我发现,通过这种方式是看不到具体的出错情况的,只会在出错的时候看到“NoMTAinstalled, discarding output”,个人觉得这种方式并没有用,因为你不能定位你到底哪里出错了。唯一的用处是,可以看到crontab中文件是否变化,重新加载。如果还是想使用这种方式,介绍一下吧。默认情况是没有cron.log文件噢,需要通过一下操作。
1. 修改rsyslog
sudo vim /etc/rsyslog.d/50-default.conf
cron.* /var/log/cron.log #将cron前面的注释符去掉
2.重启rsyslog
sudo service rsyslog restar