我需要同时运行多个 Bash 脚本(准确地说是具有不同变量的同一脚本)。为了控制选项卡的数量,我希望将它们分组在一个终端选项卡中。
脚本定期输出,我检查是否有任何问题。
如果我将它们发送到后台
./script.sh 1 &
./script.sh 2 &
./script.sh 3 &
./script.sh 4
Ctrl我将失去对它们的控制权。例如,我通过+终止脚本C。使用上述代码,我应该找到pid
每个进程以终止它们。
请注意,上面的代码是我的主脚本(例如)的内容,./all_scripts.sh
而不是在终端中键入的命令。
有没有办法在同一终端中运行脚本,同时将它们视为单个输出脚本?
答案1
你不会失去对它们的控制。您将它们(最后一个除外)发送到后台。
如果运行指定的命令链,则调用./script.sh 4
将在前台运行,其他脚本将在后台运行。输入将被发送到前台脚本。要暂停前台脚本,请按CtrlZ。要将挂起的脚本发送到后台继续运行,请使用该bg
命令。
要查看您拥有的脚本(或更准确地说,作业)以及它们所处的状态,请使用jobs
。
要使特定作业脱颖而出,请使用fg
其编号(如上述 所报告jobs
)以及%
前缀,例如fg %2
。要终止特定作业,您可以将其带到前台fg
并理智地终止它,或者也可以kill
,例如kill -TERM %2
.
答案2
在测试了不同的方法和程序后,我发现实用的解决方案是GNU 并行。我发布这个答案是因为它可能对其他人有帮助。
GNU Parallel
并不是为此任务而构建的,但完美地达到了目的。
如果运行脚本为
parallel -u ::: './script.sh 1' './script.sh 2' #(and so forth)
所有脚本将并行运行。
-u
( )标志在执行脚本时--ungroup
将脚本输出发送到其中。stdout
Ctrl+C终止该parallel
作业,并随后终止所有正在运行的脚本。
答案3
您可以用于tmux
此目的。
它是一种终端多路复用器,这意味着它将一个选项卡拆分为多个窗口。
- 使用命令启动它
tmux
。 - 使用
Contr
+B 后跟"
或%
可以将一个窗格分成两个窗格。 - 在前台启动进程。
Contr
使用 uding +B
和箭头键在进程之间切换。
现在,您可以在终端的一个选项卡中正常控制多个进程。
如果您想要聚焦(或取消聚焦)特定窗格,请使用Contr
+B
后跟Z
。
如果您需要滚动,请使用Contr
+B
后跟Q
并使用箭头键滚动(或激活鼠标模式)。
你可以找到一份备忘单这里。
也可以使该过程自动化。
答案4
任务后台处理程序可以满足这种需求。 https://vicerveza.homeunix.net/~viric/soft/ts/article_linux_com.html
您可以在 debian 和 ubuntu 中找到别名为“tsp”的工具。