如何检查 Linux shell 脚本是不是由 cronjob 执行?

Posted

技术标签:

【中文标题】如何检查 Linux shell 脚本是不是由 cronjob 执行?【英文标题】:How-to check if Linux shell script is executed by a cronjob?如何检查 Linux shell 脚本是否由 cronjob 执行? 【发布时间】:2016-01-26 02:10:14 【问题描述】:

是否可以识别 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 但请注意,语法是 subject to the cron implementation,也可以简单地被愚弄。 【参考方案1】:

一种选择是测试脚本是否附加到 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 将是 pubs.opengroup.org/onlinepubs/9699919799/utilities/test.htmlman 1p test @user2966991 在这种情况下,POSIX 意味着它应该与任何符合 POSIX 的 shell 一起工作。这样的 shell 也可以在 Windows 上找到,从技术上讲,你可以拥有一个没有 POSIX shell 的 Linux 发行版。 太好了,谢谢!对于后代,我应该添加到 Alois 的评论中,1p 手册部分不是通用的,在我使用的系统(FreeBSD、OSX 和 Ubuntu)上,man 1 test 甚至只是 man test 会告诉你可以测试的东西的列表。由于您正在运行 Linux,因此您很可能也有 bash 可用。如果是这样,您可以man bash 并搜索“条件表达式”部分以查看 bash 使用[[ 条件命令提供的扩展测试符号。 (剧透:bash 还提供-t。)

以上是关于如何检查 Linux shell 脚本是不是由 cronjob 执行?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查命令是不是存在于 shell 脚本中? [复制]

如何检查传递给 shell 脚本的参数是不是不是整数?

如何在 shell 脚本中检查目录是不是存在? [复制]

如何使用 shell 脚本检查 MySQL 数据库中是不是存在表?

如何在shell脚本中,判断一个基本命令执行是不是成功

如何检查 Docker 是不是安装在 Unix shell 脚本中? [复制]