Ctrl-C를 누를 때까지 각 명령이 종료되지 않는 몇 가지 명령을 실행하고 싶습니다. 한 번에 모두 실행하기 위해 실행할 수있는 것이 있습니까? Ctrl-C를 누르면 모두 종료됩니다. 터미널 출력을 공유 할 수 있습니다.
특히, 나침반 컴파일러, 커피 스크립트 컴파일러 및 파일 변경 사항을 감시하는 모든 파일 변경 사항을 감시하는 사용자 지정 명령이 있습니다. 각 명령에 대해 터미널을로드하고 싶지 않습니다.
답변:
이 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 병렬 절전을 시작하고 "sleep 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
후에 command1
만 실행됩니다 command1
. 시도 sleep 3 && sleep 3
하면 6 초가 걸립니다.
wait
불필요한 "process x exited"메시지를 억제하는 을 포함하도록 답변을 편집했습니다 .