我想运行一些命令,在按下 Ctrl-C 之前每个命令都不会退出。有什么我可以运行一次运行所有它们,并且 Ctrl-C 会退出它们吗?他们可以共享终端输出。
具体来说,我有 compass 编译器、coffeescript 编译器和一个监视文件更改的自定义命令,所有这些命令都在运行监视文件更改。我不想为每个命令加载一个终端。
此 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”完成。
基于@alessandro-pezzato 的评论。通过在命令之间使用来运行多个&
命令。
例子:
$ sleep 3 & sleep 5 & sleep 2 &
它将在后台执行命令。
使用GNU 并行:
(echo command1; echo command2) | parallel
parallel ::: command1 command2
杀死:
parallel ::: command1 command2 &
PID=$!
kill -TERM $PID
kill -TERM $PID
参考gnu.org 站点。
可以使用简单的 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
我建议使用我刚刚编写的更简单的实用程序。它目前称为 par,但很快将重命名为 parl 或 pll,尚未决定。
API 很简单:
par "script1.sh" "script2.sh" "script3.sh"
前缀命令可以通过以下方式完成:
par "PARPREFIX=[script1] script1.sh" "script2.sh" "script3.sh"
要运行多个命令,只需&&
在两个命令之间添加,如下所示:command1 && command2
如果您想在两个不同的终端中运行它们,那么您可以这样做:
gnome-terminal -e "command1" && gnome-terminal -e "command2"
这将打开 2 个终端command1
并command2
在其中执行。
希望这对您有所帮助。