의사 터미널 없이 비대화형 SSH 호출자를 중지하는 방법

의사 터미널 없이 비대화형 SSH 호출자를 중지하는 방법

비대화형 SSH 호출(의사 터미널 없음)을 사용하여 프로그램을 시작하고 다음을 통해 세션을 종료한다고 가정해 보겠습니다 CTRLC.

$ ssh user@server -- sleep 123
^C

이렇게 하면 SSH 세션이 종료된 후에도 프로그램( sleep 123예: 이 예의 프로그램)이 계속 실행됩니다 .server

$ ssh user@server -- ps -ef | grep "sleep 123"
user     12430       1  0 19:28 ?        00:00:00 sleep 123

local 대신 SIGINT를 원격으로 보내는 ssh옵션이 있다는 것을 알고 있습니다 . 그러나 나는 의사 터미널에 의존하지 않고 호출 시 추가 옵션을 지정하지 않고도 원격 프로그램을 중지시킬 수 있는 방법을 찾고 있습니다 .-tsleepsshssh

답변1

일부 상황에 대해서는 부분적인 해결책을 생각해 냈습니다.

아이디어는 다음과 같습니다. ssh클라이언트에서 종료되면 명령으로 실행되는 모든 프로그램은 server상위 프로세스를 잃고 init상위 프로세스가 할당됩니다.

따라서 실행 중인 프로그램을 편집하여 상위 PID를 지속적으로 확인할 수 있었다면 PID 가 1로 전환되면 클라이언트의 프로세스가 종료되어야 한다는 server것을 알 수 있습니다 .ssh

cat <<-"EOF" | ssh user@server sh
while :; do
sleep 1
ppid="$(ps -p "$$" -o ppid= | tr -d "[:blank:]")"
[ "$ppid" = 1 ] && break
done
EOF

관련 정보