
원격 서버에 SSH를 통해 수행하는 몇 가지 일반적인 작업을 자동화하려고 합니다. 이를 위해 여러 저장된 세션에서 PuTTY와 해당 "원격 명령" 옵션(연결 > SSH)을 사용하고 있습니다. 내 원격 명령은 다음과 같습니다.
~/scripts/test; $SHELL -l
실행되는 스크립트는 저장된 세션마다 다르며 다른 작업을 수행합니다. $SHELL -l
스크립트 실행이 완료된 후에도 PuTTY 세션을 활성 상태로 유지합니다.
이 모든 것은 내가 실행 중인 대부분의 스크립트에서 완벽하게 작동합니다. 그러나 Ctrl+C로 종료될 때까지 while 루프를 사용하여 일련의 명령을 실행하는 것이 있습니다. 스크립트는 정상적으로 시작되지만 PuTTY 셸은 일단 종료되면 활성 상태로 유지되지 않습니다. $SHELL -l
처형되지는 않는 것 같습니다.
이 동작을 포함하는 예제 스크립트는 다음과 같습니다.
while true; do
echo "."
sleep 2
done
다음은 수동으로 실행하면 잘 작동합니다. 두 번째 명령에서 예상되는 출력이 표시됩니다.
~/scripts/test; echo "done"
그러나 PuTTY "원격 명령"의 두 번째 명령은 실행되지 않습니다. 실제로 를 포함하도록 원격 명령을 변경하면 echo
표시되지 않습니다.
~/scripts/test; echo "done"; $SHELL -l
그래서 내 질문은 다음과 같습니다. 목록의 두 번째 명령은 수동으로 실행할 때 원격 명령으로 실행되지 않는 이유는 무엇입니까? 그리고 더 중요한 것은, 내가 그것에 대해 무엇을 할 수 있는가?
관련이 있는 경우 Ubuntu 14.04에서 PuTTY를 실행하고 있습니다.
답변1
원격 시스템에서 실행하기 위한 명령을 사용하여 실행하면 원격 SSH 서버는 해당 명령을 쉘 명령으로 실행합니다 putty
.ssh
/bin/bash -c '~/scripts/test; $SHELL -l'
bash
따라서 이 파이프라인을 실행하는 원격 시스템에 인스턴스가 있습니다 . 또한 bash
이 "테스트" 스크립트를 실행하는 첫 번째 인스턴스에서 시작된 다른 인스턴스도 있습니다 .
Control-C를 입력하면 putty
TTY에서 인터럽트 문자로 해석되는 원격 시스템으로 문자를 보냅니다. 이로 인해 TTY에 연결된 프로세스에 SIGINT(인터럽트 신호)가 전송됩니다. 이로 인해 두 셸 프로세스가 모두 중단되어 둘 다 종료됩니다. 상위 셸 인스턴스가 SIGINT를 무시하도록 하려고 합니다.
SIGINT를 무시하는 bash 명령은 다음과 같습니다.
trap "" INT
따라서 파이프라인에 대해 SIGINT를 비활성화하려면 원래 명령을 다음으로 변경합니다.
trap '' INT; ~/scripts/test; $SHELL -l
그러나 이렇게 하면 하위 프로세스에 대한 SIGINT도 비활성화되어 "테스트" 스크립트가 Ctrl-C에 면역이 됩니다. 따라서 테스트 스크립트에 대해 SIGINT를 다시 활성화해야 합니다. 이에 대한 명령은 다음과 같습니다.
trap INT
해당 줄을 테스트 스크립트 자체에 추가하거나 파이프라인에 추가할 수 있습니다.
trap '' INT; ( trap INT; ~/scripts/test ); $SHELL -l
이제 Ctrl-C를 누르면 명령 파이프라인을 실행하는 상위 프로세스가 아니라 "테스트" 프로세스를 중단해야 합니다.
Putty나 SSH를 사용하지 않고도 이를 테스트할 수 있습니다. 다음 명령을 실행하고 "sleep"이 실행되는 동안 Ctrl-C를 눌러보세요.
bash -c 'sleep 15; echo foo' # Ctrl-C kills sleep; doesn't print "foo"
bash -c 'trap "" INT ; sleep 15; echo foo' # Ctrl-C has no effect
bash -c 'trap "" INT; ( trap INT; sleep 15 ); echo foo' # Kills sleep, prints "foo"
답변2
putty 원격 명령에 대한 Ctrl+C는 실제로 SSH 세션을 중단하므로 나머지 원격 명령을 실행하지 않을 것으로 예상됩니다. 세션을 계속 활성 상태로 유지하는 것이 목표라면 무한 루프만으로도 충분합니다.