前言
由于比较懒,因此写了一个小脚本用来定时运行EPIC
的领游戏插件,之后发现 crontab
命令无法运行,因此记录一下解决方法
参考内容
查看日志
程序出错的话第一步还是先去看日志比较好,因此打开日志,发现没有日志输出,通过参考相关教程之后发现可能是日志功能未进行打开,因此
sudo vim /etc/rsyslog.d/50-default.conf
cron.* /var/log/cron.log #将cron前面的注释符去掉
sudo service rsyslog restart
- 等待执行之后,输入
tail -f /var/log/cron.log
来查看相关日志
找bug
发现问题1
在运行结束之后果然发现了相关问题,log报错记录如下:
mailed 366 bytes of output but got status 0x00ff from MTA#012
继续查询文章,发现
因此明白了解决方向
根据其博客所说,在所有要执行的语句后面加上 >/dev/null 2>&1
或者&> /dev/null
即可,即
*/5 * * * * sh /var/xxx/xxx.sh >/dev/null 2>&1
之后重启cron服务即可
service cron restart
发现问题2
crontab
什么时候会发送邮件呢?在运行脚本出错的时候。。。。因此我需要它发送的信息以便去核查代码是否有问题。。。因此我还得需要这个邮件日志。。。因此,继续查询博客,找到如下内容
把正确以及错误的日志都输出:
*/1 * * * * /root/XXXX.sh > /tmp/load.log 2>&1 &
只输出正确日志:
*/1 * * * * /root/XXXX.sh > /tmp/load.log & 等同于 */1 * * * * /root/XXXX.sh 1>/tmp/load.log &
只输出错误日志:
*/1 * * * * /root/XXXX.sh 2> /tmp/load.log &
因此,再次尝试之后,我又发现了问题3。。。
发现问题3
在 Crontab
中,默认执行路径是当前系统的根目录
,在邮件排查中,我发现了所用到的python文件进行过其他的文件调用。由于在命令行中运行,python
文件均在一起,因此无需进行目录统一。。但是在 crontab
中需要进行要求。因此可以通过曲线救国的方式,将 Crontab
的执行路径更换成脚本所在路径:
新增一个脚本文件
auto.sh
在其中输入
- ```bash
cd “你需要进入到的项目路径中”
python 1.py # 你需要执行的代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
3. 之后在`crontab`中执行该脚本文件即可
# Others
## [解决非root用户crontab定时任务无法执行问题](https://jingyan.baidu.com/article/bea41d432d4967f4c51be68a.html)(不知道有没有用,按照他的配置了,正确与否不确定)
修改/etc/pam.d/crond,把把所有required改成sufficient,这个对非root用户管用
\#
\# The PAM configuration file for the cron daemon
\#
No PAM authentication called, auth modules not needed
account sufficient pam_access.so
account include password-auth
session sufficient pam_loginuid.so
session include password-auth
auth include password-auth
```
- ```bash
尾言
又是开心的debug的半天呢(bushi)