V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
eastonwyz
V2EX  ›  Linux

学习 Shell 写了一个执行程序后发邮件的小脚本

  •  
  •   eastonwyz · 2016-12-10 16:25:02 +08:00 · 5100 次点击
    这是一个创建于 2909 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在学习 Shell 编程,正好自己也经常在服务器上跑程序,所以写了这么个小脚本来方便监控程序的运行。

    程序放在了mail-exec, 主要功能就是可以直接通过 mail-exec [command]来执行程序,程序结束后将会给指定的邮箱发送成功或失败的邮件。邮件的发送功能是通过 ssmtp 实现的,实测对 google, qq, 163 都可以支持。

    所以,欢迎大家使用和交流~因为第一次自己写小脚本,肯定很弱鸡,还请各位巨巨多多提建议或者 pr !

    11 条回复    2016-12-11 15:03:36 +08:00
    hosiet
        1
    hosiet  
       2016-12-10 17:05:14 +08:00 via Android
    我觉得通用的 sendmail 接口比 ssmtp 更实用。
    eastonwyz
        2
    eastonwyz  
    OP
       2016-12-10 19:14:49 +08:00
    @hosiet 谢谢, sendmail 有哪些好处呢?因为我之前配置过 ssmtp ,所以就直接用了 ssmtp
    knightdf
        3
    knightdf  
       2016-12-10 20:27:41 +08:00   ❤️ 1
    execute something || echo "xxx error" | mail -s 'title' 'email address'
    一行 shell 的事
    neilp
        4
    neilp  
       2016-12-10 20:32:05 +08:00
    应该使用 "$@" 而不是 "$*"

    不需要使用 "sh -c", 直接加小括号在子 shell 中运行就可以了.

    比如下面的例子: 它可以在 POSIX 兼容的任何 shell 中运行. 比如 Unix/BSD/Mac/Solaris/Linux/Cigwin 等等.

    ```
    #!/usr/bin/env sh


    if ( "$@" ); then
    msg="Command '$@' success! "
    else
    msg="Command '$@' failed! "
    fi



    echo "$msg" | mail -s "$@" [email protected]


    ```
    aleen42
        5
    aleen42  
       2016-12-10 21:30:28 +08:00   ❤️ 1
    我寫的這個文檔你也可以參考一下。 https://github.com/SoundTooth/checkServer#1-mutt

    Mutt 可以實現無賬號即可發送郵件,服務器報警就是用的 Mutt 。
    smallaccount
        6
    smallaccount  
       2016-12-11 02:30:16 +08:00
    @knightdf 直接进垃圾邮件箱了,怎么办?
    eastonwyz
        7
    eastonwyz  
    OP
       2016-12-11 11:50:35 +08:00
    @neilp 谢谢,这样确实更好。求问怎么能获得 error 信息呢?
    knightdf
        8
    knightdf  
       2016-12-11 12:03:11 +08:00
    @smallaccount 发件域名添加信任就可以了
    eastonwyz
        9
    eastonwyz  
    OP
       2016-12-11 12:36:08 +08:00
    @neilp 我自己搜了一下搞定了,把 stderr redirect 到一个临时文件然后从文件中读取,为了保证 stderr 中仍然保留错误消息,再重新把读取的文件输出到 stderr 就可以了!谢拉,我已经更新了我的脚本。
    sola97
        10
    sola97  
       2016-12-11 13:03:46 +08:00
    遇到 QQ 邮箱这种系统拦截比域名信任还优先的
    neilp
        11
    neilp  
       2016-12-11 15:03:36 +08:00
    @eastonwyz

    我发了一个 pr 给你.

    https://github.com/EastonWang/mail-exec/pull/1

    你自己看看吧.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3485 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 04:58 · PVG 12:58 · LAX 20:58 · JFK 23:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.