【问题标题】:How to redirect cron job output to stdout如何将 cron 作业输出重定向到标准输出
【发布时间】:2016-07-26 06:38:19
【问题描述】:

我有一个 cron 作业,它的输出现在被重定向到一个文件中。如下所示

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

谁能帮我把它的输出重定向到标准输出?

【问题讨论】:

标签: linux unix cron crontab


【解决方案1】:

运行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,然后您就可以在终端上同时获得 STDOUT 和 STDERR。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 当您注销或退出当前 shell 时,该 tty 将变为无效(关闭并可能稍后重用)。
    • 你怎么能跟踪这个?因为使用 tail -f /dev/pts/1 会记录:No such file or directory
    【解决方案3】:

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

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

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

    【讨论】:

    • 这有什么用?例如,在我的系统上,/usr/bin/cron 进程的 stdout 和 stderr 被定向到套接字。
    • @KeithThompson 我的场景是我使用一个运行 cron 服务的 docker 容器(使用 cron -f 使 cron 在前台运行),因为我想收集日志以进行监控和分析。根据 12 factor app - Treat logs as event streams 所以我将 cron 日志重定向到标准输出。
    • 这真的有效吗?您是否能够访问写入这些套接字的数据?
    • 我突然想到,对于 docker 场景,指定 procid=1 : /proc/1/fd/1 2>&1 更准确,因为 proc 1 是 docker 日志的输出
    • 为了dockerdon't needcrond.pid。并且请明确说明您提供的是docker-only 解决方案。否则会很混乱。
    猜你喜欢
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2020-11-05
    相关资源
    最近更新 更多