sh脚本如何确定它是否是作为cron作业而不是交互式或背景?

我想为cron和交互式使用相同的脚本,只是想知道在UNIX / Linux系统上是否有通用的方法来轻松地做出这个决定。

你可以尝试用这样的方式返回父进程的名字:

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

对我来说,当我交互式地运行这个时,这个返回的konsole

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

 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 

根本没有普遍的办法。 使用交互式/非交互式shell检测或tty检测也是不可靠的,因为除cron之外的其他情况可以具有这些特征。 只需在您的cron条目中添加一个variables即可。 说你需要运行test.sh,然后用这个来代替。

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

如果你控制cron设置,这相当简单可靠。

我不知道这是多么的便携,但是在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区分开来,所以这不应该成为问题。

除此之外,可能最健壮的解决scheme是在脚本中添加一个开关,告诉它是否从cron运行,正如Stack Overflow问题中所build议的那样。