【发布时间】:2017-06-07 11:46:28
【问题描述】:
我已经实现了一种方法来识别脚本是否从 cron 作业运行。它使用ps 爬升进程树并识别是否有任何(递归)父命令包含“cron”或“CRON”。
这个解决方案在工作时速度很慢(比如大约一秒钟),并且每次我调用它们时都会影响我拥有的所有脚本。我正在寻找更快的解决方案。
我不想在 crontab 内的脚本中添加任何选项,因为我的目标是在命令行上没有提供通知选项时精确定义默认通知行为,并使该默认行为与 cron 作业不同。
是否有一种相当可靠、快速的方法来确定脚本(或其递归父级之一)是否是从 cron 作业启动的?
在我最初的帖子之后,我重新编写了我的代码并能够对其进行改进,尽管ps 仍在使用中。代码如下,欢迎提出建议。
is_cron_job()
{
local PS
local CMD
local PID=$$
while :
do
PS="$(ps -h -o ppid,comm -p $PID)"
[[ "$PS" =~ ^[[:space:]]*([0-9]+)[[:space:]]+(.*)$ ]] || return 1
PID="${BASH_REMATCH[1]}"
[[ "$PID" -ge 1 ]] || return 1
CMD="${BASH_REMATCH[2]}"
! [[ "$CMD" =~ crond|CROND ]] || return 0
done
return 1
}
【问题讨论】:
-
您可以在
crontab文件中设置一个环境变量,并在您的脚本中检查它。 -
This question 询问 PHP,但大多数答案也适用于 bash 脚本。简而言之,不,默认情况下,cron 本身不会给您任何标识自己的信息,但是很容易检测到交互式使用;例如如果 stdout 和 stdin 都连接到终端,
[[ -t 0 && -t 1 ]]将评估为 true。 -
也许这是一个 XY 问题?从 cron 运行有什么特别之处?也许您应该使用更容易测试的不同标准?
-
“以防我的脚本安装在我无法控制的服务器上”。安装说明应该说设置变量。或者你应该提供一个安装脚本。
-
那么我认为你被 ps 解决方案所困扰,或者可能是使用
/proc来做类似的事情。但这没有简单的方法。