我想运行一些命令,直到按Ctrl-C才会退出。我是否可以运行一次即可运行所有这些程序,而Ctrl-C会全部退出它们?他们可以共享终端输出。
具体来说,我有指南针编译器,coffeescript编译器和一个监视文件更改的自定义命令,所有命令都在运行中监视文件更改。我不想为每个命令加载一个终端。
Answers:
该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”完成。
wait
优于while循环。我已经根据您的建议改进了我的脚本。现在它也适用于N个并行命令。
基于@ 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
parallel
在EPEL存储库中。
可以使用简单的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"
parallel ::: "script1.sh" "script2.sh" "script3.sh"
第二个通常会使用--tag: parallel --tag ::: "script1.sh" "script2.sh" "script3.sh"
要运行多个命令,只需&&
在两个命令之间添加如下所示:command1 && command2
如果要在两个不同的终端中运行它们,则可以这样做:
gnome-terminal -e "command1" && gnome-terminal -e "command2"
这将打开2个终端,command1
并command2
在其中执行。
希望这对您有所帮助。
command2
之后 运行。尝试一下,您会发现它需要6秒钟。command1
command1
sleep 3 && sleep 3
wait
,这将消除不必要的“退出进程x”消息。