我想为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议的那样。