86

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

具体来说,我有 compass 编译器、coffeescript 编译器和一个监视文件更改的自定义命令,所有这些命令都在运行监视文件更改。我不想为每个命令加载一个终端。

4

6 回答 6

136

此 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";

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

parallel_commands "cmd arg0 arg1 arg2" "other_cmd arg0 arg2 arg3"

例子:

parallel_commands "sleep 1" "sleep 2" "sleep 3" "sleep 4"

启动 4 个并行睡眠并等待“睡眠 4”完成。

于 2012-06-06T07:23:08.790 回答
102

基于@alessandro-pezzato 的评论。通过在命令之间使用来运行多个&命令。

例子:

$ sleep 3 & sleep 5 & sleep 2 &

它将在后台执行命令。

于 2016-07-24T16:51:58.697 回答
38

使用GNU 并行

(echo command1; echo command2) | parallel
parallel ::: command1 command2

杀死:

parallel ::: command1 command2 &
PID=$!
kill -TERM $PID
kill -TERM $PID

参考gnu.org 站点

于 2014-07-25T17:22:34.167 回答
4

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

sleep%:
        sleep $(subst sleep,,$@)
        @echo $@ done.

使用-j选项。

$ make -j sleep3 sleep2 sleep1
sleep 3
sleep 2
sleep 1
sleep1 done.
sleep2 done.
sleep3 done.

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

$ make -j sleep3 sleep2 sleep1
sleep 3
sleep3 done.
sleep 2
sleep2 done.
sleep 1
sleep1 done.

您也可以使用 `-n' 选项进行试运行。

$ make -j -n sleep3 sleep2 sleep1
sleep 3
sleep 2
sleep 1
于 2018-04-11T13:00:17.343 回答
1

我建议使用我刚刚编写的更简单的实用程序。它目前称为 par,但很快将重命名为 parl 或 pll,尚未决定。

https://github.com/k-bx/par

API 很简单:

par "script1.sh" "script2.sh" "script3.sh"

前缀命令可以通过以下方式完成:

par "PARPREFIX=[script1] script1.sh" "script2.sh" "script3.sh"
于 2015-04-10T06:19:41.747 回答
-14

要运行多个命令,只需&&在两个命令之间添加,如下所示:command1 && command2

如果您想在两个不同的终端中运行它们,那么您可以这样做:

gnome-terminal -e "command1" && gnome-terminal -e "command2"

这将打开 2 个终端command1command2在其中执行。

希望这对您有所帮助。

于 2017-06-03T10:28:05.800 回答