mdpc Asked: 2013-08-21 15:25:14 +0800 CST2013-08-21 15:25:14 +0800 CST 2013-08-21 15:25:14 +0800 CST sh 脚本如何确定它是作为 cron 作业而不是交互式或后台作业启动的? 772 我想对 cron 和交互式使用相同的脚本,只是想知道是否有一种通用的方法可以在 UNIX/Linux 系统上轻松做出这个决定。 unix 3 个回答 Voted Best Answer AngryWombat 2013-08-21T16:16:26+08:002013-08-21T16:16:26+08:00 您可以尝试使用以下内容返回父进程的名称:- 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 johnshen64 2013-08-21T16:05:35+08:002013-08-21T16:05:35+08:00 根本没有通用的方法。使用交互式/非交互式 shell 检测或 tty 检测也不可靠,因为 cron 以外的其他情况可能具有这些特征。只需在您的 cron 条目中添加一个变量。说你需要运行 test.sh,然后改用它。 $ RUNENV=cron ./test.sh cron cat ./test.sh #!/bin/sh echo $RUNENV 如果您控制 cron 设置,这是相当简单和可靠的。 Paulo Almeida 2013-08-21T16:01:53+08:002013-08-21T16:01:53+08:00 我不知道它的可移植性如何,但在 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 问题中所建议的那样。
您可以尝试使用以下内容返回父进程的名称:-
对我来说,当我以交互方式运行它时,它返回了konsole 。
或者您可以编写一些逻辑脚本来处理情况。
现在,在执行脚本时,您可以将选项作为属性传递,如下所示:-
根本没有通用的方法。使用交互式/非交互式 shell 检测或 tty 检测也不可靠,因为 cron 以外的其他情况可能具有这些特征。只需在您的 cron 条目中添加一个变量。说你需要运行 test.sh,然后改用它。
如果您控制 cron 设置,这是相当简单和可靠的。
我不知道它的可移植性如何,但在 Linux 上你可以运行
tty
并检查输出是否为 tty。请注意,如果脚本从 cron 以外的其他东西以非交互方式运行,则 tty 也不会设置,但既然您说过要区分 cron 和交互,那应该不是问题。
除此之外,最可靠的解决方案可能是在脚本中添加一个开关,告诉它是否从 cron 运行,如Stack Overflow 问题中所建议的那样。