可以检查它是否在调用时被回调的Shell脚本

jpa*_*ich 3 bash shell zsh

我编写了一个依赖于其他服务器响应的脚本(使用wget来提取数据),我希望它始终在后台运行,毫无疑问.我知道一个解决方案就是编写一个包装脚本,它将使用附加的'&'调用我的脚本,但我想避免这种混乱.

有没有办法让bash(或zsh)脚本确定是否用./foo.sh&调用它,如果没有,退出并重新启动它本身?

谢谢大家!

Gil*_*il' 7

后台进程的定义(我认为)是它有一个控制终端,但它不是该终端的前台进程组的一部分.我不认为任何shell,甚至zsh,都可以通过内置函数访问这些信息.

在Linux(可能还有其他unices)上,STATps包含一个+进程是其终端的前台进程组的一部分.因此,对您的问题的字面答案是您可以将脚本的内容放在main函数中并使用以下命令调用它:

case $(ps -o stat= -p $$) in
  *+*) main "$@" &;;
  *) main "$@";;
esac
Run Code Online (Sandbox Code Playgroud)

main "$@" &无论如何你也可能会跑步.在Unix上,fork很便宜.

但是,我强烈建议不要做你的建议.这使得某人无法运行您的脚本并在之后执行其他操作 - 人们希望能够编写your_script; my_postprocessing或者your_script && my_postprocessing,但是分支脚本的主要任务使得这不可能.考虑到在调用脚本时,增益偶尔会保存一个字符,因此以这种方式使脚本显得不那么有用是不值得的.

如果你的意思是让脚本在后台运行以便用户可以关闭他的终端,你需要做更多的工作 - 你需要守护脚本,这不仅包括后台处理,还包括关闭所有文件描述符终端开放,使该过程成为会议的领导者和更多.我认为这需要将您的脚本拆分为守护程序包装脚本和主脚本.但是,除非明确停止,否则通常会对永不终止的程序执行守护程序,这不是您描述的行为.