在同一终端中一次运行并行多个命令

Oli*_*eng 62 linux bash

我想运行一些命令,在按下Ctrl-C之前,每个命令都不会退出.有什么我可以运行同时运行所有这些,Ctrl-C将退出它们吗?他们可以共享终端输出.

具体来说,我有罗盘编译器,coffeescript编译器和一个自定义命令,它监视文件更改所有正在运行的文件更改.我不想为每个命令加载终端.

Ale*_*ato 102

此bash脚本适用于N个并行线程.每个参数都是一个命令.

trap在捕获SIGINT时将杀死所有子进程.
wait $PID_LIST等待每个过程完成.当所有进程完成后,程序退出.

#!/bin/bash

for cmd in "$@"; do {
  echo "Process \"$cmd\" started";
  $cmd & pid=$!
  PID_LIST+=" $pid";
} done

trap "kill $PID_LIST" SIGINT

echo "Parallel processes have started";

wait $PID_LIST

echo
echo "All processes have completed";
Run Code Online (Sandbox Code Playgroud)

将此脚本另存为parallel_commands并使其可执行.
这是如何使用这个脚本:

parallel_commands "cmd arg0 arg1 arg2" "other_cmd arg0 arg2 arg3"
Run Code Online (Sandbox Code Playgroud)

例:

parallel_commands "sleep 1" "sleep 2" "sleep 3" "sleep 4"
Run Code Online (Sandbox Code Playgroud)

启动4个并行睡眠并等待"睡眠4"结束.

  • 很酷。陷阱是我一直在寻找的东西。我修改了您的答案,使其包含“等待”,这将消除不必要的“进程x退出”消息。 (3认同)
  • @MTsoul,“wait”比 while 循环更好。我根据您的建议改进了我的脚本。现在它也适用于 N 个并行命令。 (2认同)

nsa*_*ana 63

根据@ alessandro-pezzato的评论,运行多个命令,只需&在命令之间使用.

例:

$ sleep 3 & sleep 5 & sleep 2 &
Run Code Online (Sandbox Code Playgroud)

它将在后台运行命令.

  • 像这样执行时,Control-C 并不会完全结束所有并行命令,它们将继续在后台运行。结束所有命令执行的正确方法是什么? (4认同)
  • 运行 fg,然后按 Ctrl+C,根据需要重复 (2认同)

Ole*_*nge 31

使用GNU Parallel:

(echo command1; echo command2) | parallel
parallel ::: command1 command2
Run Code Online (Sandbox Code Playgroud)

杀人:

parallel ::: command1 command2 &
PID=$!
kill -TERM $PID
kill -TERM $PID
Run Code Online (Sandbox Code Playgroud)


hir*_*shi 5

可以使用简单的 Makefile 来完成:

sleep%:
        sleep $(subst sleep,,$@)
        @echo $@ done.
Run Code Online (Sandbox Code Playgroud)

使用-j选项。

$ make -j sleep3 sleep2 sleep1
sleep 3
sleep 2
sleep 1
sleep1 done.
sleep2 done.
sleep3 done.
Run Code Online (Sandbox Code Playgroud)

如果没有-j选项,它会串行执行。

$ make -j sleep3 sleep2 sleep1
sleep 3
sleep3 done.
sleep 2
sleep2 done.
sleep 1
sleep1 done.
Run Code Online (Sandbox Code Playgroud)

您还可以使用“-n”选项进行试运行。

$ make -j -n sleep3 sleep2 sleep1
sleep 3
sleep 2
sleep 1
Run Code Online (Sandbox Code Playgroud)