如何在终端窗口中同时运行多个 Bash 脚本?

Goo*_*bot 12 bash ubuntu terminal shell-script gnome-terminal

我需要同时运行多个 Bash 脚本(准确地说是具有不同变量的相同脚本)。为了控制选项卡的数量,我希望将它们分组在一个终端选项卡中。

脚本会定期输出,我会检查是否有任何问题。

如果我将它们发送到后台

./script.sh 1 &
./script.sh 2 &
./script.sh 3 &
./script.sh 4
Run Code Online (Sandbox Code Playgroud)

我将失去对他们的控制。例如,我通过Ctrl+终止脚本C。使用上面的代码,我应该找到pid每个进程来杀死它们。

请注意,上面的代码是我的主脚本(例如./all_scripts.sh)的内容,而不是要在终端中键入的命令。

有没有办法在同一终端中运行脚本,同时将它们视为单个输出脚本?

Dop*_*oti 17

你不会失去对它们的控制。您将它们(除了最后一个)发送到后台。

如果您运行您指定的命令链,则调用./script.sh 4将在前台运行,而其他脚本将在后台运行。输入将被发送到前台脚本。要暂停前台脚本,请按CtrlZ。要将挂起的脚本发送到后台继续运行,请使用该bg命令。

要查看您拥有的脚本(或更准确地说,作业)及其所处的状态,请使用jobs.

要使特定工作脱颖而出,请使用fg其编号(如上述报告的jobs)和%前缀,例如fg %2. 要终止特定作业,您可以将其置于前台fg并理智地终止它,或者您可以kill这样做,例如kill -TERM %2.

  • 也就是说,如果您需要做的只是并行运行脚本并等待它们完成,您可以执行类似`./script.sh 1 & ./script.sh 2 & ./script.sh 3 & 的操作。 /script.sh 4 & wait` 在你的脚本中。 (2认同)

Goo*_*bot 14

在测试了不同的方法和程序后,我发现实用的解决方案是GNU Parallel。我发布这个答案,因为它可能会帮助其他人。

GNU Parallel 不是为此任务而构建的,但完全符合目的。

如果将脚本运行为

parallel -u ::: './script.sh 1' './script.sh 2' #(and so forth)
Run Code Online (Sandbox Code Playgroud)

所有脚本将并行运行。

-u--ungroup)标志发送脚本输出变换成stdout在执行脚本。

Ctrl+C终止parallel作业,然后终止所有正在运行的脚本。

  • 实际上,我认为 `parallel` 正是为这个用例而构建的。您说这是您正在运行的相同脚本,但参数不同,对吗?这就是“并行”所做的。您在此处列出它的方式很好,但您可能还需要考虑类似`parallel -u ./script.sh ::: 1 2 #(等等)`。另请参阅“--line-buffer”选项。 (8认同)

Hau*_*ing 5

您可以将输出重定向到一个文件(每个进程一个或组合一个)。如果写入量很小(512 字节是安全的,甚至可能是 4K),那么拥有一个文件对于所有内容来说并不是问题。小写入是原子的:

./script.sh 1 >output.1 2>&1 &
./script.sh 2 >output.2 2>&1 &
./script.sh 3 >output.3 2>&1 &
./script.sh 4 >output.4 2>&1 &
./script.sh 5 >output.5 2>&1 &

while wait % >/dev/null 2>&1; do : ; done
Run Code Online (Sandbox Code Playgroud)

如果您以交互方式执行此操作,那么以下内容可能会有所帮助:您可以通过预先添加(否则无用的)环境变量定义(例如 BackGround 任务 ID)来轻松解决作业:

bgtid=foo ./script.sh 1 &
[...]
kill %bgtid=foo
Run Code Online (Sandbox Code Playgroud)

命令前缀必须明确(因此没有bgtid=foobgtid=foobar)。


dan*_*1st 5

您可以tmux为此使用。

它是一个终端多路复用器,意味着它将一个选项卡拆分为多个窗口。

  • 使用命令启动它tmux
  • 使用Contr+B 后跟"%将窗格拆分为两个窗格。
  • 在前台启动进程。
  • 在进程之间切换 uding Contr+B后跟箭头键。

现在,您可以在终端的一个选项卡中正常控制多个进程。

如果要聚焦(或取消聚焦)特定窗格,请使用Contr+B后跟Z

如果您需要滚动使用Contr+B然后Q使用箭头键滚动(或激活鼠标模式)。

您可以在此处找到备忘单。

也可以使该过程自动化。