我想运行一些命令,在按下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"结束.
nsa*_*ana 63
根据@ alessandro-pezzato的评论,运行多个命令,只需&
在命令之间使用.
例:
$ sleep 3 & sleep 5 & sleep 2 &
Run Code Online (Sandbox Code Playgroud)
它将在后台运行命令.
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)
可以使用简单的 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)
归档时间: |
|
查看次数: |
87030 次 |
最近记录: |