我想对 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 问题。