后台同步进程

后台同步进程

我想在后台启动 2 个进程,但我需要第二个进程等待第一个进程完成。两者都会很长,所以我还需要能够从终端注销。

目前我有这个:

 nohup ./script1.sh $arg1 &    
 wait
 nohup ./script1.sh $arg2 &

这里的问题是我无法在等待时使用我的终端或注销。我还尝试捕获命令'1 PID 并将其提供给等待,但问题仍然存在。

总之,我想启动调用 script1 和 script2 的主脚本,关闭我的终端并在 5 天后打开它。这个时候我需要先运行script1,只有运行完之后script2才能开始运行。

答案1

基本概念 ...

要依次运行两个脚本,您可以在它们之间放置一个分号:script1 args ...; script2 args ...或者在脚本中,您也可以将它们放在两行上,如下所示:

#!/bin/sh
script1 args ...
script2 args ...

如果您想在后台运行它们,这也适用。您只需将它们放入子 shell 中并将子 shell 放在后台:(script1 args ...; script2 args ...) &或者:

#!/bin/sh
(
  script1 args ...
  script2 args ...
) &

如果您只想在第一个脚本成功退出(使用代码0)时才运行第二个脚本,您可以将分号替换为&&script1 args ... && script2 args ...

...使用 nohup

却又nohup想跑命令和子 shell 不是单个命令,它是仅在 shell 中工作的 shell 结构。但是我们可以启动一个新的 shell 来执行这两个脚本,将其作为一个命令传递给nohup并将所有这些放在后台:

#!/bin/sh
nohup sh -c 'script1 args ...; script2 args ...' &

如果你有变量,args ...你将不得不使用双引号,并且你必须特别小心正确地转义它们,所以这里是另一种方法:

... 带双叉

shell 只知道并关心它的直接子级。当您尝试退出时,如果仍有进程在后台运行,您会收到警告,并且如果您确实退出 shell,这些直接子进程将被杀死。解决方案是在后台放置一个子 shell,该子 shell 本身会将您的命令置于后台。您的 shell 只会了解子 shell,而不了解命令。但你不能依赖nohub这样的重定向魔法,必须设置你自己的重定向:

#!/bin/sh
(
  # outer subshell, will be known to your shell
  (
    # inner subshell, "hidden" from your interactive shell
    script1 "$args" ... > ~/script1.stdout.log 2> ~/script1.stderr.log
    script2 "$args" ... > ~/script2.stdout.log 2> ~/script2.stderr.log
    # note that you can do normal quoting here
  ) &
) &

相关内容