한 디렉토리의 모든 스크립트를 동시에 실행하고 싶습니다.
모든 스크립트 목록을 얻고 "ls ./*.sh"를 사용하여 디렉터리의 첫 번째 스크립트를 실행할 수 있다는 것을 알고 있지만 모두 실행할 수는 없는 것 같습니다.
또한 중괄호 확장 {./*.sh;을 시도했지만 첫 번째 스크립트만 실행했습니다.
이 모든 것을 실행하는 방법을 알아낸 후에는 모두 백그라운드에서 실행하고 싶습니다.
for 루프를 사용하여 이 작업을 수행할 수 있다는 것을 알고 있지만, 단순히 작업을 수행하는 와일드카드나 중괄호 확장을 사용하는 간단한 라이너가 있기를 바랍니다.
어떻게 해야 하나요?
답변1
for script in ./*.sh; do "$script" & done
wait
또는 GNU를 사용하여 동시 호출 수를 제한합니다 xargs
.
xargs -n1 -P5 -r0a <(printf '%s\0' ./*.sh) env
(스크립트 이름에 =
문자가 포함되어 있지 않다고 가정합니다.)
또는 다음을 사용하여 zsh
:
autoload zargs # best in ~/.zshrc
zargs -n1 -P5 ./*.sh -- command
(여기서는 최대 5개)
이러한 스크립트가 출력을 생성하는 경우 심각한 인터리브가 발생할 수 있습니다. GNU는 parallel
각 명령의 출력을 별도의 임시 파일에 저장하고 순차적으로 출력하여 이 문제를 해결합니다.
parallel -j0 exec ::: ./*.sh
( -j0
이 모든 것을 병렬로 실행하려면 CPU 코어 수에 대한 제한을 제거하거나 직접 숫자를 지정하십시오).
답변2
폴더를 다음 명령에 전달하여 폴더의 모든 스크립트를 실행할 수 있습니다 run-parts
.
run-parts /path/to/folder &
답변3
백그라운드에서 각 셸 스크립트를 실행합니다.
sh -x script1.sh & sh -x script2.sh & sh -x script3.sh &
현재 명령이 완료될 때까지 기다리지 않고 다음 명령을 실행할 수 있도록 각 스크립트를 백그라운드 모드에서 실행합니다.
'&'는 스크립트가 백그라운드에서 실행되도록 하여 프롬프트가 완료될 때까지 기다리지 않도록 합니다.
답변4
백그라운드에서 스크립트를 실행합니다.
./myscript.sh & ./myscript2.sh & ....