[linux] 동일한 터미널에서 한 번에 병렬 여러 명령 실행

Ctrl-C를 누를 때까지 각 명령이 종료되지 않는 몇 가지 명령을 실행하고 싶습니다. 한 번에 모두 실행하기 위해 실행할 수있는 것이 있습니까? Ctrl-C를 누르면 모두 종료됩니다. 터미널 출력을 공유 할 수 있습니다.

특히, 나침반 컴파일러, 커피 스크립트 컴파일러 및 파일 변경 사항을 감시하는 모든 파일 변경 사항을 감시하는 사용자 지정 명령이 있습니다. 각 명령에 대해 터미널을로드하고 싶지 않습니다.



답변

이 bash 스크립트는 N 병렬 스레드 용입니다. 각 인수는 명령입니다.

trapSIGINT가 잡히면 모든 하위 프로세스를 종료합니다.
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″가 완료 될 때까지 기다립니다.


답변

@ 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


답변

간단한 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로 이름이 변경 될 예정이며 아직 결정되지 않았습니다.

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

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 개 단자을 열 command1command2 그들 내에서 실행한다.

도움이 되었기를 바랍니다.


답변