使用 shell 脚本,可以知道何时使用 cron 运行还是手动运行?

使用 shell 脚本,可以知道何时使用 cron 运行还是手动运行?

使用 shell 脚本,可以知道何时使用 cron 运行还是手动运行?

更新:

有人问我为什么想知道。我的 cron 作业将被记录,如果有人手动执行它,我希望能够记录。

答案1

当我需要这样做时,我知道这是一个我永远不会重定向到文件或管道的脚本。因此,一个简单的测试是检查 stdout(又名文件描述符 1)是否是 tty(它不会来自 cron)。在 bash 中:

if [ -t 1 ]
then
    : # running from terminal
else
    : # not running from terminal, cron maybe
fi

再次,警告,这只是一个简单的测试,看看您的 stdout 是否是 tty。但对于我的简单目的来说,它是有用的。

您还可以检查您的父进程是什么。在 Linux 中,它可以很简单:

if grep -q cron /proc/$PPID/cmdline &> /dev/null
then
    : # running from cron
fi

答案2

您可以在 crontab 中定义一个唯一的环境变量:

RUNNINGFROMCRON=1

16 18 * * *     /usr/local/bin/crontest

我用这个脚本测试过:

#! /bin/bash

echo " running script "

echo -n "testing for var: "
echo $RUNNINGFROMCRON

当我运行时输出cron是:

running script 
testing for var: 1

当我手动从命令行运行时,输出是:

running script 
testing for var:

答案3

您可以检查父进程的名称,可以使用 进行检索ps -p $PPID -o comm=。当然,这是可以欺骗的。

然而,这不一定是个好主意(例如,您将无法轻松地手动测试您的 cron 作业)。也许如果您解释一下您想要这样做的原因,有人可以提出更好的解决方案。

答案4

您可以创建一个特殊用户来运行 cron 作业。然后让该脚本仅供该用户读取,并将其放入该用户的 crontab 中。这样,其他用户就无法读取该脚本,更不用说执行它了。

顺便说一句,为了获得安全的解决方案,无论如何您都需要使 cron 脚本不可读。如果其他用户可以读取该脚本,他们可以复制它,删除您拥有的任何 cron 检查机制,然后运行它,如果他们愿意的话,可以绕过您的日志记录。

相关内容