如何检查 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.html 或man 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 执行?的主要内容,如果未能解决你的问题,请参考以下文章