sleep 10
예를 들어 매우 긴 명령이 있다고 가정해 보세요 . paramiko
Python(특히 ssh 라이브러리)을 사용하여 다른 서버에서 실행 하려고 합니다 .
명령을 시작하고, 명령의 PID를 인쇄한 다음, 완료될 때까지 기다리고, 마지막으로 명령의 종료 상태를 반환하는 한 줄 명령이 필요합니다.
내가 지금까지 시도한 것 :
bash -c "echo $BASHPID ; exec sleep 10" ; echo $?
이는 쉘의 PID를 인쇄한 다음 긴 명령에 대해 exec를 호출한 다음 기다렸다가 종료 상태를 인쇄합니다. 문제는 $BASHPID
외부 bash 쉘의 PID를 인쇄하는 것입니다(아마도 호출이 bash -c cmd
실제로 완전한 새 쉘을 생성하지 않는다는 것을 나타냄).
위의 명령을 세 줄로 호출하면 작동합니다.
bash
echo $BASHPID ; exec sleep 10
echo $?
서브 쉘을 사용하려는 시도는 나에게 효과가 없습니다.
echo $(echo $BASHPID ; exec sleep 10) ; echo $?
이것은 작동하지만 서브셸은 모든 출력을 echo로 파이프하고 echo는 모든 것을 즉시 인쇄합니다. 즉, $BASHPID
절전 모드가 완료될 때까지 인쇄하지 않습니다. PID는 즉시 인쇄되어야 합니다.
답변1
예를 들어 실행하면 다음과 같습니다.
bash -c "echo $BASHPID; 절전 10 수행"
또는
echo$(echo$BASHPID; 절전 10 실행)
$BASHPID
현재 쉘은 두 번째 bash(또는 하위 쉘)가 보기 전에 변수를 삽입하고 있습니다. 해결책은 현재 셸이 이러한 변수를 확장하지 못하도록 방지하는 것입니다.
bash -c 'echo $BASHPID ; exec sleep 10'
답변2
ssh
이는 다른 쉘을 시작하지 않고 이미 실행한 쉘 명령입니다 (원격 사용자의 로그인 쉘로 해석됨). 쉘이 Bourne과 유사하거나 csh와 유사하다고 가정합니다.
echo "$$"; exec sleep 10
그 정도면 충분합니다. bash
원격 호스트에는 설치가 필요 하지 않습니다 . ssh
원격 명령의 종료 상태도 인쇄되지 않고 보고됩니다. 하지만 꼭 해야 한다면 다음과 같이 할 수 있습니다.
sleep 10 & echo "$!"; wait; echo "$?"
$?
csh 와 같은 쉘에서는 작동하지 않습니다 $status
.
원격 사용자의 로그인 셸이 Bourne의 로그인 셸과 유사하다고 보장할 수 없는 경우 다음을 수행할 수 있습니다.
exec sh -c 'sleep 10 & echo "$!"; wait; echo "$?"'
이 명령은 최소한 Bourne, csh 및 rc 시리즈 쉘과 호환되어야 합니다.