如何在 Bash 脚本中的不同屏幕会话中启动多个作业?

如何在 Bash 脚本中的不同屏幕会话中启动多个作业?

我想要使​​用的程序可以通过启动

./myprogram < input_part1.txt > output_part1.txt

如何myprogram在一个BASH脚本中启动四个作业,其中每个作业在单独的SCREEN会话中运行?在我启动脚本之前,会话不存在。

我试过:

#!/bin/bash
screen -mdS test1 ./myprogram < input_part1.txt > output_part1.txt
screen -mdS test2 ./myprogram < input_part2.txt > output_part2.txt
screen -mdS test3 ./myprogram < input_part3.txt > output_part3.txt
screen -mdS test4 ./myprogram < input_part4.txt > output_part4.txt

但这不起作用。为什么不?

答案1

对于单个会话,我使用类似的东西:

cat > screenrc-test <<EOF
screen -t test1 sh -c "./myprogram < input_part1.txt > output_part1.txt"
screen -t test2 sh -c "./myprogram < input_part2.txt > output_part2.txt"
screen -t test3 sh -c "./myprogram < input_part3.txt > output_part3.txt"
screen -t test4 sh -c "./myprogram < input_part4.txt > output_part4.txt"
EOF

screen -S test-all -c screenrc-test

我不知道为什么你想要多个会话,但语法是类似的:

screen -mdS test1 sh -c "./myprogram < input_part1.txt > output_part1.txt"

每个会话。重定向需要使用 shell,否则重定向将应用于命令screen而不是myprogram.

一个例子:

#!/bin/sh
screen -mdS test1 zsh -c "repeat 4 { date; sleep 1; } > out1"
screen -mdS test2 zsh -c "repeat 4 { date; sleep 1; } > out2"
screen -mdS test3 zsh -c "repeat 4 { date; sleep 1; } > out3"

运行后(等待 4 秒),我得到:

==> out1 <==
Tue Sep  2 09:23:07 CEST 2014
Tue Sep  2 09:23:08 CEST 2014
Tue Sep  2 09:23:09 CEST 2014
Tue Sep  2 09:23:10 CEST 2014

==> out2 <==
Tue Sep  2 09:23:07 CEST 2014
Tue Sep  2 09:23:08 CEST 2014
Tue Sep  2 09:23:09 CEST 2014
Tue Sep  2 09:23:10 CEST 2014

==> out3 <==
Tue Sep  2 09:23:07 CEST 2014
Tue Sep  2 09:23:08 CEST 2014
Tue Sep  2 09:23:09 CEST 2014
Tue Sep  2 09:23:10 CEST 2014

显示命令是并行运行的。

相关内容