bash脚本可以判断它是否通过cron运行?

Top*_*gio 26 bash cron

没有太多运气谷歌搜索这个问题,我想在SF上发布它,但它实际上似乎是一个开发问题.如果没有,请随意迁移.

所以,我有一个脚本每天凌晨3点左右通过cron运行.我有时也手动运行相同的脚本.问题是,每次我手动运行脚本并失败时,它都会向我发送一封电子邮件; 即使我可以查看输出并在控制台中查看错误.

有没有办法让bash脚本告诉它是通过cron运行的(也许是通过使用whoami)并且只发送电子邮件,如果是这样的话?当我正在进行测试时,我很想停止接收电子邮件...

eru*_*orm 26

你可以尝试"tty"来查看它是否由终端运行.这不会告诉你它是由cron专门运行的,但你可以判断它是否"不是用户作为提示".

你也可以得到你的父亲pid并在树上追查cron,虽然那有点笨拙.

  • 谢谢你的回答!我选择的前一个答案实际上不是我想要的(交互式shell).由于你的答案,我通过谷歌搜索"bash tty test"找到了我真正需要的东西.基本上,在你的脚本中调用`tty -s`然后检查`$?`:如果它是0,你是tty,如果它大于0,你就不是. (15认同)
  • `tty` 是一个外部命令(coreutils 的一部分,但仍然是一个分支),有几种方法可以使用内置的东西来做同样的事情,在 https://unix.stackexchange.com/a/46801/103306 中描述 (3认同)

d-_*_*_-b 9

为什么没有一个命令行参数-t用于测试或-c用于cron.

或者更好的是:

-e=email@address.com

如果未指定,请不要发送电子邮件.


Geo*_*edy 9

这里有两种不同的选择:

  • 通过电子邮件发送脚本/程序,让cron处理它.如果在crontab中设置MAILTO变量,cron将发送打印到该电子邮件地址的任何内容.例如:

    MAILTO=youremail@example.com
    # run five minutes after midnight, every day
    5 0 * * *       $HOME/bin/daily.job
    
    Run Code Online (Sandbox Code Playgroud)
  • 在crontab中设置一个环境变量,用于确定是否在cron下运行.例如:

    THIS_IS_CRON=1
    # run five minutes after midnight, every day
    5 0 * * *       $HOME/bin/daily.job
    
    Run Code Online (Sandbox Code Playgroud)

    在你的脚本中

    if [ -n "$THIS_IS_CRON" ]; then echo "I'm running in cron"; else echo "I'm not running in cron"; fi
    
    Run Code Online (Sandbox Code Playgroud)


she*_*kwi 8

我有类似的问题.我通过检查stdout是否是TTY来解决它.这是检查脚本是否以交互模式运行的检查:

if [ -t 1 ] ; then 
    echo "interacive mode";
else
    #send mail
fi
Run Code Online (Sandbox Code Playgroud)

我得到了这个:如何检测我的shell脚本是否通过管道运行?

如果文件描述符是打开的并且引用终端,则-t test返回true.'1'是标准输出.


Tal*_*Tal 6

我知道问题已经过时了,但我遇到了同样的问题.这是我的解决方案:

CRON=$(pstree -s $$ | grep -q cron && echo true || echo false)
Run Code Online (Sandbox Code Playgroud)

然后测试

if $CRON
then
    echo "Being run by cron"
else
    echo "Not being run by cron"
fi
Run Code Online (Sandbox Code Playgroud)

与@eruciform提到的相同的想法 - 跟随你的PID在进程树上检查cron.

注意:此解决方案仅适用于cron,与其他一些解决方案不同,后者可以在非交互式运行脚本时随时工作.


edo*_*ceo 5

对我有用的是检查$TERM. 在 cron 下它是“愚蠢的”,但在 shell 下它是别的东西。set在终端中使用该命令,然后在 cron 脚本中查看它

if [ "dumb" == "$TERM" ]
then
    echo "cron"
else
    echo "term"
fi
Run Code Online (Sandbox Code Playgroud)