我编写了一个依赖于其他服务器响应的脚本(使用wget来提取数据),我希望它始终在后台运行,毫无疑问.我知道一个解决方案就是编写一个包装脚本,它将使用附加的'&'调用我的脚本,但我想避免这种混乱.
有没有办法让bash(或zsh)脚本确定是否用./foo.sh&调用它,如果没有,退出并重新启动它本身?
谢谢大家!
后台进程的定义(我认为)是它有一个控制终端,但它不是该终端的前台进程组的一部分.我不认为任何shell,甚至zsh,都可以通过内置函数访问这些信息.
在Linux(可能还有其他unices)上,STAT列ps包含一个+进程是其终端的前台进程组的一部分.因此,对您的问题的字面答案是您可以将脚本的内容放在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,但是分支脚本的主要任务使得这不可能.考虑到在调用脚本时,增益偶尔会保存一个字符,因此以这种方式使脚本显得不那么有用是不值得的.
如果你的意思是让脚本在后台运行以便用户可以关闭他的终端,你需要做更多的工作 - 你需要守护脚本,这不仅包括后台处理,还包括关闭所有文件描述符终端开放,使该过程成为会议的领导者和更多.我认为这需要将您的脚本拆分为守护程序包装脚本和主脚本.但是,除非明确停止,否则通常会对永不终止的程序执行守护程序,这不是您描述的行为.