没有太多运气谷歌搜索这个问题,我想在SF上发布它,但它实际上似乎是一个开发问题.如果没有,请随意迁移.
所以,我有一个脚本每天凌晨3点左右通过cron运行.我有时也手动运行相同的脚本.问题是,每次我手动运行脚本并失败时,它都会向我发送一封电子邮件; 即使我可以查看输出并在控制台中查看错误.
有没有办法让bash脚本告诉它是通过cron运行的(也许是通过使用whoami)并且只发送电子邮件,如果是这样的话?当我正在进行测试时,我很想停止接收电子邮件...
eru*_*orm 26
你可以尝试"tty"来查看它是否由终端运行.这不会告诉你它是由cron专门运行的,但你可以判断它是否"不是用户作为提示".
你也可以得到你的父亲pid并在树上追查cron,虽然那有点笨拙.
这里有两种不同的选择:
通过电子邮件发送脚本/程序,让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)我有类似的问题.我通过检查stdout是否是TTY来解决它.这是检查脚本是否以交互模式运行的检查:
if [ -t 1 ] ; then
echo "interacive mode";
else
#send mail
fi
Run Code Online (Sandbox Code Playgroud)
我得到了这个:如何检测我的shell脚本是否通过管道运行?
如果文件描述符是打开的并且引用终端,则-t test返回true.'1'是标准输出.
我知道问题已经过时了,但我遇到了同样的问题.这是我的解决方案:
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,与其他一些解决方案不同,后者可以在非交互式运行脚本时随时工作.
对我有用的是检查$TERM. 在 cron 下它是“愚蠢的”,但在 shell 下它是别的东西。set在终端中使用该命令,然后在 cron 脚本中查看它
if [ "dumb" == "$TERM" ]
then
echo "cron"
else
echo "term"
fi
Run Code Online (Sandbox Code Playgroud)