sh 脚本如何确定它是作为 cron 作业启动的,还是作为交互式或后台启动的?

sh 脚本如何确定它是作为 cron 作业启动的,还是作为交互式或后台启动的?

我想对 cron 和 interactive 使用相同的脚本,只是想知道在 UNIX/Linux 系统上是否存在一种通用的方法可以轻松做出这一决定。

答案1

您可以尝试使用以下命令返回父进程的名称:-

ps -ocommand= -p $PPID | awk -F/ '{print $NF}' | awk '{print $1}'

对我来说这又回来了控制台当我以交互方式运行它时。

或者您可以编写一些逻辑来处理情况。

while getopts cm opt
do
case $opt in
        c)
                ##  Do crontask 
        ;;
        m)
                ##  Do manual
        ;;
        esac
done

现在,当执行脚本时,您可以将选项作为属性传递,如下所示:-

/use/local/bin/example.sh -m
/use/local/bin/example.sh -c

答案2

根本没有通用的方法。使用交互式/非交互式 shell 检测或 tty 检测也不可靠,因为除了 cron 之外的其他情况也可能具有这些特征。只需在您的 cron 条目中添加一个变量。假设您需要运行 test.sh,那么就使用它。

$ RUNENV=cron ./test.sh
cron
cat ./test.sh 
#!/bin/sh
echo $RUNENV

如果您控制 cron 设置,这将相当容易且可靠。

答案3

我不知道它的可移植性如何,但在 Linux 上您可以运行tty并检查输出是否是 tty。

$ tty
/dev/pts/2
$ crontab -e
* * * * * echo $(tty) >> /home/paulo/cron_tty
[Wait a minute...]
$ cat /home/paulo/cron_tty
not a tty

请注意,如果脚本以非交互方式从 cron 以外的其他程序运行,则 tty 也不会被设置,但由于您说要区分 cron 和交互式,所以这应该不是问题。

除此之外,可能最强大的解决方案是向脚本添加一个开关,告诉它是否从 cron 运行,如Stack Overflow 问题

相关内容