如何检查Linux shell脚本是否是通过cron作业执行的?

6

如何判断Linux shell脚本是由用户还是cronjob执行的?

如果可以,我该如何判断/检查shell脚本是否由cronjob执行?

我想在我的脚本中实现一个功能,当它被用户执行时返回一些其他信息,就像这样:

    if [[ "$type" == "cron" ]]; then
        echo "This was executed by a cronjob. It's an automated task.";
    else
        USERNAME="$(whoami)"
        echo "This was executed by a user. Hi ${USERNAME}, how are you?";
    fi

使用环境变量?* * * * * CRON_FIRED=true /path/to/myscript 但请注意,语法取决于cron实现,并且可以轻松被欺骗。 - bishop
1个回答

8

有一个选择是测试脚本是否附加到tty上。

#!/bin/sh

if [ -t 0 ]; then
   echo "I'm on a TTY, this is interactive."
else
   logger "My output may get emailed, or may not. Let's log things instead."
fi

请注意,由at(1)触发的作业也是在没有tty的情况下运行的,尽管这不是cron特定的。
同时请注意,这是POSIX标准,而不是仅适用于Linux(或bash)。

谢谢,看起来这是解决方案。我总是忘记在哪里可以找到可用的“if”测试参数列表,例如-n、-x、-f以及您使用的-t。我在哪里可以找到这个列表?我想读一下,“-t”具体意味着什么。POSIX意味着它适用于每个Linux发行版,对吗? - user2966991
1
@user2966991,这是链接:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html 或者使用命令 man 1p test - Alois Mahdal
1
在这种情况下,POSIX意味着它应该能够与任何符合POSIX标准的shell一起使用。这样的shell也可以在Windows上找到,并且从技术上讲,你可以拥有一个没有POSIX shell的Linux发行版。 - Alois Mahdal
1
太好了,谢谢!为了后人,我应该补充一下Alois的评论,即“1p”手册部分不是普遍适用的,在我使用的系统(FreeBSD、OSX和Ubuntu)中,“man 1 test”甚至只需“man test”就可以显示可测试的内容列表。由于你正在运行Linux,你很可能也有bash可用。如果有的话,你可以man bash并搜索“CONDITIONAL EXPRESSIONS”部分,以查看bash提供的扩展测试符号,使用[[条件命令。(提示:bash还提供了-t。) - ghoti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接