我想用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:添加了更好的答案。