AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1153915
Accepted
Shovas
Shovas
Asked: 2024-02-20 04:25:48 +0800 CST2024-02-20 04:25:48 +0800 CST 2024-02-20 04:25:48 +0800 CST

仅在 stderr 上通过电子邮件发送所有 cron stdout+stderr 输出

  • 772

我希望 cron 只在 stderr 输出上发送电子邮件,但当它这样做时,它应该包括所有 stdout 和 stderr

这与仅在 stderr 上发送电子邮件的常见问题不同(即将 stdout 重定向到 /dev/null)。在这种情况下,cron 只通过电子邮件发送 stderr,但我想查看上下文的所有内容。

我正在运行 Rocky 9,并使用 cronie 作为 cron 守护进程。

cron
  • 2 2 个回答
  • 98 Views

2 个回答

  • Voted
  1. Esa Jokinen
    2024-02-20T05:33:45+08:002024-02-20T05:33:45+08:00

    如果命令以非零状态代码退出,您可以尝试:

    bash -c 'command 2>&1 > /tmp/err || mail -A /tmp/err [email protected]'
    

    在哪里:

    • bash -c ''允许在 cronjob 上使用多个命令;您也可以使用脚本。
    • command是要执行的命令的路径
    • 2>&1将 stderr 重定向到 stdout
    • > /tmp/err将标准输出(现在是两个流)保存到文件(路径/tmp/err)
    • ||仅当第一个命令失败且状态代码非零时才运行第二个命令
    • mail -A /tmp/err将文件作为附件发送
      • mail [email protected] < /tmp/err会将其作为消息正文发送

    您可以使用以下方法来增强此功能,例如,在同时运行且文件末尾缺少某些内容的mktemp情况下,为每个日志使用不同的路径。sleep

    • 3
  2. Best Answer
    Shovas
    2024-02-21T04:51:28+08:002024-02-21T04:51:28+08:00

    我决定编写一个脚本来近似解决仅在 stderr 输出上发送电子邮件的问题。

    关键是将 stdout/stderr 存储到文件中,直到检测到 stderr,然后输出组合文件。

    只要 tail 能够足够快地迭代其文件,组合文件就可以大致说保留了 stdout/stderr 顺序。如果没有缓冲并且命令需要超过一两秒,并且 stdout/stderr 输出之间存在一些延迟,则此方法可以近似有序的 stdout/stderr 输出。

    我将此脚本称为 cron-wrapper.sh。它的目的是接受命令和参数并运行它们。

    它旨在从 crontab 中调用,如下所示:

    30 * * * * root sh cron-wrapper.sh sh cron-job.sh >/dev/null

    请注意,当在 stderr 上输出所有内容时,“所有内容”都会输出到 stderr 而不是 stdout,以满足我的要求,即 cron 通过电子邮件发送 stderr 输出上的所有内容

    脚本:

    #!/bin/bash
    
    # Input
    cmd=$1
    shift
    
    # Run given command in background so we can tail output files immediately
    stdoutFile=`mktemp`
    stderrFile=`mktemp`
    $cmd "${@}" >"$stdoutFile" 2>"$stderrFile" &
    cmdPid=$!
    
    # Tail stdout and stderr files
    teeFile=`mktemp`
    tail -F -s 0.01 --pid=$cmdPid --quiet --silent "$stdoutFile" "$stderrFile" | tee "$teeFile"
    
    # Output everything if stderr output detected
    if [ -s "$stderrFile" ]; then
            cat "$teeFile" >&2
    fi
        
    # Clean up
    rm -f "$stdoutFile" "$stderrFile" "$teeFile"
    
    • 0

相关问题

  • 每 4 小时运行一次 cron 的正确语法是什么?[复制]

  • 用于 mysql 数据库清理和备份的 crontab

  • Windows cron 作业

  • 使用 crontab 和 /etc/cron.hourly,daily,weekly 的区别

  • crontab ifconfig 什么都不输出

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve