답변:
아니, 적절한 살인 방법 autossh
은 단순히 프로세스를 죽이는 autossh
것입니다.
그 이유는
# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable
그것은 autossh
단순히 서비스가 아닌 쉘 스크립트 입니다. 마지막 줄에서 새 프로그램을 시작합니다.
exec /usr/lib/autossh/autossh "$@"
다시는 서비스가 아닙니다. 에 관해서는 exec
(당신이 그것을 한 번 확인 할 수 배쉬 해커의 위키 )는 (다음 명령을 사용하여 현재 쉘을 대체하는 쉘 내장 명령입니다 /usr/lib/autossh/autossh "$@"
새로운 프로세스를 시작하지 않고이 경우). 따라서 중지 하는 유일한 방법 autossh
은 호출 스크립트 를 종료하는 것 입니다.
pkill -3 autossh
-3 플래그 사용의 중요성을 지적한 dviljoen 에게 감사드립니다 ( 아래 참조). 또한, 호출 명령 ( 즉 , 위의 명령 )은 이전 연결이 끊어진 것을 인식하자마자 새 연결을 시작 하기 때문에 연결 종료가 작동하지 않습니다 . ssh
SIGTERM
기본값이며 그 중 하나는 15
입니다. SIGQUIT
is 3
, superuser.com/questions/352147/what-does-kill-3-mean 및 en.wikipedia.org/wiki/Kill_(command) 참조 -또한 FWIW는 방금 확인 -15
했지만 종료하지 않았습니다. 그래서 SIGTERM
사용할 수 없습니다.
pkill
신호없이 사용 하면 (= the default
) 종료되지 않습니다 autossh
.
다음과 같이 auto ssh를 실행하십시오.
AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh
그것을 죽여 :
kill pid
BTW
pkill -9 autossh
잘못이다
-9
그래서, 확인 프로세스가 정상적으로 종료하지하게 ssh
때 프로세스가 계속이 autossh
프로세스가 살해
없이도 -9
여전히 나쁘다. 만약 여러 개의 터널을 운영하고 pkill
있다면 모두 죽일 것이다.
올바른 방법은 AUTOSSH_PIDFILE
env var 를 설정 kill
하고 pid 만 설정 하는 것입니다
나는 이것이 답변되었지만 위의 의견과 달리 pkill -3 autossh
sshd 자식 프로세스를 사용 하지 않습니다.
내 .bashrc
파일 에서이 기능을 사용 합니다.
기본적 --kill
으로 autossh에 인수를 추가하는 것과 같습니다 .
if [ "$1" = "--kill" ]; then
ps aux |
grep -P "(/usr/bin/ssh|/usr/lib/autossh/autossh)\s.*$2" |
awk '{print $2}' |
xargs -r kill
else
$(which autossh) "$@"
echo "" # prevents line wrapping when you kill the ssh process
fi
시스템에서 경로를 실행 which ssh
하고 which autossh
확인할 수 있습니다 .
첫 번째 인수가 아닌 한 --kill
, 인수 를 autossh에 전달합니다.
이 스크립트는 autossh 및 ssh 인스턴스를 종료합니다. 포트 전달을 사용하는 경우 이것은 중요합니다. autossh 인스턴스 만 종료해도 터널이 종료되지 않고, 마지막으로 연결이 끊어진 경우 다시 연결되는 것을 막기 때문입니다.
특정 터널 만 종료하도록 검색어 (호스트 이름)를 지정할 수도 있습니다.
autossh --kill dbserver1
dbserver1에 대한 연결 만 종료하면
autossh --kill dbserver
dbserver1, dbserver2 등
autossh --kill dbserver
이 종료되고 모든 autossh 연결이 종료됩니다.
명확히하기 위해 autossh로 시작한 SSH 세션 만 종료해야합니다.
ps aux | grep ssh
autossh 및 ssh 세션을 모두 실행 하는 동안 실행 하면 autossh로 시작한 세션이 전체 경로 (/ usr / bin / ssh 및 / usr / lib / autossh / autossh)를 사용한다는 것을 알 수 있습니다.
이 스크립트는 speicifc 경로로 시작한 프로세스에만 결과를 일치시킵니다. 나는 일반적으로 ssh
전체 경로가 아닌 입력 하고 대부분의 사람들을 가정하기 때문에이 작업을 수행하여 정상적인 ssh 세션을 종료하지 못하게합니다.
이것이 다른 사람들을 돕기를 바랍니다.
$(which autossh)
단순히 대신에 특별한 이유가 autossh
있습니까?