폴더에서 Bash 스크립트를 동시에 실행


10

.sh폴더 ( my_folder) 에 5 개의 Bash ( ) 스크립트가 있고 다음과 같이 이름이 지정되어 있다고 가정 합니다.

script_1.sh
script_2.sh
script_3.sh
script_4.sh
script_5.sh

여섯 번째 Bash 스크립트 또는이 모든 스크립트를 함께 실행하기위한 하나의 라이너를 작성하려면 어떻게해야합니까?

한 번에 한꺼번에 실행하지 않고 5 개의 스크립트를 동시에 실행해야합니다.


답변:


12

GNU parallel는 이런 종류의 것에 완벽합니다. 설치 sudo apt install parallel후 다음을 수행하십시오.

parallel -j0 ::: my_folder/*sh

-j프로세스는 병렬로 실행되는 프로세스 수를 제어 -j0하며 "모든 프로세스 "를 의미합니다. -j20스크립트를 일괄 적으로 실행하려면 다른 값 (예 :)으로 설정하십시오 .


1
참고 : 패키지 의 parallel명령 도 있습니다 moreutils. 예제 사용은 : parallel -j 20 -- my_folder/*.sh(GNU는 달리 parallel, -j0한 번에 스크립트를 실행하는 것입니다).
jfs

1
@jfs 좋은 지적. 그러나 sudo apt install parallel파일 /usr/bin/parallel을 GNU 병렬 파일로 바꿉니다. 그래서 당신이 그것을 설치하는 한, 내 대답에서 알 수 있듯이 예상대로 작동합니다.
terdon

예, parallelGNU 병렬을 제안하는 대답을 쓰는 동안 설명서에서 명령을 성공적으로 시도하지 않을 때 어려운 방법을 발견했습니다 .
jfs

9

모든 스크립트를 동시에 (병렬로) 실행하려면 다음을 사용하십시오.

script_1.sh &
script_2.sh &
script_3.sh &
script_4.sh &
script_5.sh &

하나씩 순차적으로 실행하려면 다음을 사용하십시오.

script_1.sh &&
script_2.sh &&
script_3.sh &&
script_4.sh &&
script_5.sh

주석 향상

동시에 실행하려는 200 개의 스크립트가있는 경우 (시스템 BTW가 다운 될 수 있음)이 스크립트를 사용하십시오.

#!/bin/bash
for Script in my_folder/*.sh ; do
    echo bash "$Script" &
done

다음 명령으로 스크립트 속성을 실행 가능으로 설정하십시오.

chmod a+x /path/to/script.sh

스크립트를 처음 실행하면 실행중인 200 개의 스크립트 이름 만 에코됩니다. 올바른 이름이 선택되면 스크립트를 편집하고 다음 줄을 변경하십시오.

    echo bash "$Script" &

에:

    bash "$Script" &

여기에 답변 된 것처럼 다른 스크립트에서 bash 스크립트를 호출하는 방법에는 세 가지가 있습니다.

  1. 다른 스크립트를 실행 가능하게 만들고 #!/bin/bash맨 위에 줄을 추가 하고 파일이 $PATH환경 변수에 대한 경로를 추가하십시오 . 그런 다음 일반 명령으로 호출 할 수 있습니다.

  2. 또는 다음과 같이 소스 명령 (별칭은.)으로 호출하십시오. source /path/to/script;

  3. 또는 bash 명령을 사용하여 실행하십시오. /bin/bash /path/to/script;

OP의 경우 200 개 스크립트 중 하나 이상 #!/bin/bash이 파일에서 shebang 첫 번째 행을 포함하지 않았습니다 . 이러한 옵션으로 3.을 사용해야했습니다.


동시에 실행되는 200 개의 스크립트

그들이 "동시에 실행하고 있는지"에 대한 의견이 제기되었습니다. 일반적인 8 CPU 시스템에서는 25 개의 스크립트가 동시에 하나의 CPU를 공유하지만 시간 조각 (밀리 초 단위로 측정)이 끝날 때까지 한 번에 하나의 스크립트 만 실행됩니다. 그런 다음 다음 작업은 밀리 초의 공정한 몫을 받고 다음 작업 등을 받게됩니다.

느슨한 용어로 우리는 200 개의 작업이 "동시"실행되고 있지만 8 개의 CPU에서 "동시"실행되지 않고 CPU 당 25 개의 작업과 동일하다고 말할 수 있습니다.

thread states.png

Linux 커널 스케줄러의 위 이미지 및 설명

타임 슬라이스 .png


감사합니다 .. 실제 경우에는 200 개가 넘는 스크립트를 실행해야합니다. 그래서 하나의 명령으로 모든 파일을 실행할 수있는 방법이 있습니까 (예 : 파일 이름을 쓰지 않고)?
aaaaa

@aaaaa 200 스크립트에 대한 답변을 변경했습니다.
WinEunuuchs2Unix

감사. 그것은 당신의 마지막 줄에 추가해야 할 유일한 것은 'bash'였습니다. 그렇지 않으면 '권한이 거부되었습니다'.
aaaaa

1
@aaaaa 실제로 200 개 이상의 모든 스크립트가 동시에 실행되는 것을 선호합니까, 아니면 한 번에 조금 더 작은 수 (예 : 10)를 실행하고 다른 스크립트는 하나 이상이 완료 될 때 실행되도록 대기하고 싶습니까? 현재 실행중인 스크립트 수가 해당 숫자 아래로 떨어 집니까? (이러한 솔루션에 관심이 있다면 스크립트 수, 실행 시간, 작업 종류 등에 대한 정보로 질문을 편집하는 것이 좋습니다.)
Eliah Kagan

의견을 보내 주셔서 감사합니다. bash스크립트 호출에 접두사를 포함하도록 답변을 업데이트했습니다 .
WinEunuuchs2Unix

3

이를위한 도구가 있습니다 man run-parts.

예를 들어, 나는 :

 run-parts ${visorhome}/pbackup.d/

Palm Pilot 백업 스크립트에서 ${visorhome}/pbackup.d/:

01PopulateJpilot  02Extract_Pedometer  03URLs  04google  05Books  06Weight  07Sec  08Bkgm 50hardlinks

1
@ eliah-kagan "동시에 200 개 이상의 스크립트"를 실행하는 것은 현명하지 않은 것 같습니다. 시스템을 스트레스 테스트하는 좋은 방법이 될 수 있습니다
월터 레이터

좋은 지적. run-partsOP가 요청 한대로 한 번에 스크립트가 아닌 순차적으로 스크립트 를 실행 한다는 언급을 여전히 원한다고 생각합니다 . 그러나 한 번에 200 개의 스크립트를 실행하는 것은 5를 실행하는 것과 동일하게 수행되지 않을 수 있으며 한 번에 모두 실행해도 아무런 문제가 발생하지 않아도 여전히 불필요 할 수 있습니다. 나는 한 주석 영업 이익이 점에서 자신의 환경 설정을 명확히 제시 할 수 있습니다.
Eliah Kagan

run-parts스크립트를 실행하지 않습니다 (이름에 점이 있습니다 :my_folder/*.sh
jfs

1
run-parts특정 very_ 어떤 이상한 이유로 파일 이름 요구 사항. 확장자가있는 파일 이름을 시작하지 않으므로 여기에서 작동하지 않을까 걱정됩니다.
terdon

1

다음을 사용하여 디렉토리에서 모든 *.sh스크립트 를 동시에 실행하려면 다음을 my_folder사용하십시오 xargs.

$ ls my_folder/*.sh | xargs -P0 -n1 bash

에 동시에 실행 스크립트의 수를 제한하려면 10:

$ ls my_folder/*.sh | xargs -P10 -n1 bash

ls스크립트에서 출력을 사용하는 것은 좋지 않습니다 . 사용하는 find것이 훨씬 안전합니다. 여기 첫 번째 항목입니다 : mywiki.wooledge.org/BashPitfalls#for_f_in_.24.28ls_.2A.mp3.29
Joe

@Joe는 일반적으로 사실입니다. 이 특별한 경우에는 문제가 보이지 않습니다.
jfs

이미 알고 있기 때문입니다. 나중에 여기에 오는 사람들은 그렇지 않을 수도 있습니다.
Joe

@Joe는 맹목적으로 교리를 따르지 않습니다. 하나의 옵션이 다른 옵션보다 낫다는 것보다 자신을 생각하십시오.
jfs

교리가 아닙니다. 나는 그들에게 알레르기가 있습니다. 그러나 나는 ls가 방출 할 수있는 것들을 보았다. 사람이 읽을 수있는 출력 구문 분석은 신뢰할 수 없습니다. 개발자가 유지할 인센티브는 없습니다
Joe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.