폴더에서 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.