원격 SSH 세션에서 앰퍼샌드 뒤에 명령 실행

원격 SSH 세션에서 앰퍼샌드 뒤에 명령 실행

여러 다른 컴퓨터에서 리소스를 많이 사용하는 긴 명령을 실행하는 쉘 스크립트가 있습니다.

각 컴퓨터에서 스크립트를 병렬로 실행하기 위해 for 루프의 각 원격 명령 뒤에 & 기호가 있습니다.

initialize-cluster.sh:

while read host; 
do
    ssh -f "$host" \"/home/user/allocate.sh\" &
done < ~/cluster

그러나 for 루프가 끝날 때 쉘 프롬프트가 표시되지 않는 것으로 나타났습니다. 이렇게 하면 모든 컴퓨터에서 initialize-cluster.sh실행이 완료된 후 다른 스크립트를 실행할 수 없습니다.allocate.sh

예를 들어 다음과 같은 명령을 실행하고 싶습니다.

./initalize-cluster.sh && ./execute-something-else.sh

그러나 initialize-cluster아직 "완료"된 것은 아닙니다.

allocate.sh원격 시스템의 모든 스크립트가 완료된 후에만 후속 명령이 실행되기를 원합니다.

답변1

이 스크립트의 어떤 내용도 다음 명령이 실행되거나 쉘 프롬프트로 돌아가는 것을 방해해서는 안 됩니다. 프롬프트가 사라진 것처럼 보이는 것은 쉘로 돌아온 후 도착하는 원격 스크립트의 출력입니다. 이를 방지하려면 stdout/stderr을 로그 파일로 리디렉션할 수 있습니다.

원격 명령이 백그라운드에서 실행 중이므로 원본 스크립트가 완료됩니다.앞으로스크립트 allocate실행이 완료되었습니다. 다음 명령은 초기화가 완료되었다고 가정할 수 없습니다. 모든 초기화를 병렬로 시작하고 모두 완료될 때까지 기다리려면 다음을 수행할 수 있습니다.

#!/bin/sh
while read host 
do
  ssh "$host" "/home/user/allocate.sh" &
done < ~/cluster
wait

그러면 작동합니다:

./initialize-cluster.sh && ./execute-something-else.sh

여기서 핵심은 wait하위 프로세스가 완료될 때까지 기다리는 명령입니다.

관련 정보