如何将cron job的输出重定向到标准输出(stdout)

29

我有一个cron job,它的输出现在被重定向到一个文件中。它看起来像下面这样:

0 9 * * * /bin/sh /bin/cleanup.sh > /home/darkknight/cleanup.log

有人能帮我将其输出重定向到标准输出(stdout)吗?


4
可能是 如何重定向脚本的全部输出 的重复问题。 - Bhavesh
http://unix.stackexchange.com/questions/52330/how-to-redirect-output-to-a-file-from-within-cron - Bhavesh
cron 在 shell 的后台运行,所以您想将输出重定向到哪个 stdout - Avihoo Mamka
在我的情况下,我可以从终端启用调试日志。我想将该终端设置为标准输出。 - shafeeq
@AvihooMamka:它不在shell的后台运行。它与任何shell都没有关联。 - Keith Thompson
显示剩余2条评论
3个回答

52

运行的进程有一个 PID,其文件描述符(fd)映射到/proc/<PID>/fd。我们可以在/var/run/crond.pid中找到正在运行的cron进程的PID。

要将cron日志发送到stdout,我们可以将日志写入由cron启动的进程的fd号码1。

0 9 * * * /bin/sh /bin/cleanup.sh > /proc/$(cat /var/run/crond.pid)/fd/1 2>&1

12
我的情境是我使用一个运行 cron 服务的 Docker 容器(使用 cron -f 命令让 cron 在前台运行),因为我希望收集日志以进行监控和分析。根据“12 因素应用”原则——将日志视为事件流,因此我将 cron 日志重定向到标准输出。 - gaga5lala
6
我想到对于Docker场景,更准确的是指定procid=1/proc/1/fd/1 2>&1,因为进程1是输出到Docker日志的内容。 - Chris F Carroll
1
那么你怎么才能跟踪它呢?因为如果我尝试 tail -f $(/proc/$(cat /var/run/crond.pid)/fd/1),我会得到权限被拒绝的错误。 - P.Lorand
1
@gaga5lala,你能提供一些你的解决方案的代码片段吗?我已经尝试了两天,但是无法让它工作。 - Max Schindler
1
在这种情况下,使用>来追加而不是覆盖是否足够?还是说它仍然会覆盖先前的日志?如果它会覆盖日志,你能否为其他人添加一个注释,说明需要在>>>之间进行选择? - Zelphir Kaltstahl
显示剩余4条评论

10

在任何终端上输入tty,我们将获得该特定终端窗口的设备文件,例如/dev/pts/1。 将cron作业重定向到此文件,如cleanup.sh > /dev/pts/1


2
当您注销或退出当前 shell 时,该 tty 将变为无效(关闭并可能稍后重新使用)。 - Keith Thompson
你怎么才能tail这个文件呢?因为使用tail -f /dev/pts/1会记录:没有这个文件或目录。 - P.Lorand

3
运行命令 cat /home/darkknight/cleanup.log,你会在标准输出(STDOUT)中看到结果。如果你没有看到预期的输出,可能需要按照以下方式修改 cron 任务:

0 9 * * * /bin/sh /bin/cleanup.sh > /home/darkknight/cleanup.log 2>&1

这样可以获取 cleanup.sh 写入其标准错误输出(STDERR)的内容。

如果你不想丢失昨天的输出,可以按照以下方式进行修改:

0 9 * * * /bin/sh /bin/cleanup.sh >> /home/darkknight/cleanup.log 2>&1

或者,直接执行 /bin/sh /bin/cleanup.sh 命令,这样你就可以在终端上同时看到标准输出和标准错误输出的内容了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接