默认情况下,使用
grep CRON /var/log/syslog
可以看到crontab的一些相关log,但是信息并不太多。你能看到crontab执行了哪个命令,但是看不到命令执行的输出信息。
如果希望看到crontab中执行的脚本或命令的输出信息及错误信息可以使用2>&1
将这些信息输出到log文件。
首先解释一下:
2>&1
我们知道>和<是文件重定向符。那么1和2是什么?
在shell中,每个进程都和三个系统文件 相关联:标准输入stdin
,标准输出stdout
、标准错误stderr
,三个系统文件的文件描述符分别为0
,1
,2
。所以2>&1
的意思就是将标准错误也输出到标准输出当中。
所以在crontab中如果0点0分执行一个命令(例如python ~/myscript.py
),需要看它的log可以这样做:
0 0 * * * python ~/myscript.py > /tmp/myscript.log 2>&1
但是这样默认是没有时间戳
的,如果你想加上时间戳,有如下几种方法:
1. 使用moreutils
的ts
(本人推荐,简单明了)
sudo apt-get install moreutils
然后上述命令改写为:
0 0 * * * python ~/myscript.py 2>&1|ts > /tmp/myscript.log
2. 使用脚本
新建一个~/predate.sh
:
#!/bin/bash
while read line ; do
echo "$(date): ${line}"
done
那么上述命令可以改为:
0 0 * * * python ~/myscript.py 2> >( ~/predate.sh > /tmp/myscript.log )
3. 把predate.sh直接写在命令行中:
0 0 * * * python ~/myscript.py 2> >( while read line; do echo "$(date): ${line}"; done > /tmp/myscript.log )
参考文献: