使用nohup同时执行多个脚本

使用nohup同时执行多个脚本

我想用nohup同时执行四个脚本。这些脚本都在同一个文件夹中。

像这样的东西会起作用吗?:

nohup /.scrip1.sh & /.scrip2.sh & /.scrip3.sh & /.scrip4.sh 

这会打印一个 nohup.out 吗?

答案1

每个脚本前面加上前缀nohup

for script in ./script{1..4}.sh; do
    nohup "$script" &
done

根据nohup手册,输出是追加到名为 的文件nohup.out,这意味着所有输出都将写入同一个文件。但请注意,当所有脚本同时运行并写入文件时,输出可能会混杂在一起。

为了避免混合输出,最好写入单个文件:

for script in ./script{1..4}.sh; do
    nohup "$script" >"$script.out" 2>&1 &
done

cat ./script{1..4}.sh.out一旦所有脚本执行完毕,您就可以将所有输出文件连接到一个流中。当命令返回时,所有后台任务都已完成运行wait(假设作业仍与当前 shell 会话关联)。


这个的一个变体:

nohup sh -c 'for script do "$script" >"$script.out" 2>&1 & done' sh ./script{1..4}.sh

这里唯一的区别是,它nohup应用于一个内联sh -c脚本,该脚本在给定一些要执行的参数的情况下运行我们的循环。输出仍然.out像以前一样写入文件。

这是有效的,因为sh -c脚本会忽略 HUP 信号(由于nohup),并且执行每个脚本的 shell 也会忽略该信号(“忽略 HUP 信号”是继承的)。

答案2

您可以编写其他脚本来在同一操作中执行四个脚本:

$ cat all.sh
bash scrip1.sh &
bash scrip2.sh &
bash scrip3.sh &
bash scrip4.sh &
$ cat scrip1.sh
echo hello1

跑步nohup bash all.sh

$ cat nohup.out
hello1
hello2
hello3
hello4

答案3

nohup只能运行一个程序。要在 nohup 下运行多个程序,您可以使用sh -c

nohup sh -c "/.scrip1.sh & /.scrip2.sh & /.scrip3.sh & /.scrip4.sh"

正如中所解释的这个答案

以下内容不会保护脚本免受 HUP 信号的影响。

要在单个 nohup 实例中运行多个程序,您需要在运行子 shell 的 echo 中运行脚本,echo $()如下所示:

nohup echo $(/.scrip1.sh & /.scrip2.sh & /.scrip3.sh & /.scrip4.sh)

但是,脚本的输出将被连接,因此在编写输出时请考虑到这一点。

编辑:错字

EDIT2:添加了为什么我的答案不好。

EDIT3:添加了更好的答案。

相关内容