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
.
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
作业,然后终止所有正在运行的脚本。
您可以将输出重定向到一个文件(每个进程一个或组合一个)。如果写入量很小(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=foo
和bgtid=foobar
)。
归档时间: |
|
查看次数: |
18804 次 |
最近记录: |