To pytanie zostało poruszone kilka razy, nie tylko tutaj, ale także w innych witrynach sieci wymiany stosów (np. Jak zrobić ssh, aby zabijał zdalny proces, gdy przerywam sam ssh? ). Nie mogę jednak sprawić, by którekolwiek z tych rozwiązań działało dla mnie.
Uruchamiam polecenie przez ssh. Ilekroć wychodzę z ssh, chcę, aby polecenie również zginęło. To polecenie to demon o nazwie ktserver, który działa bez końca, dopóki nie naciśniesz Ctrl-C.
Uruchamiam to w następujący sposób: ssh -t compute-0-1 ktserver
i rzeczywiście, kiedy naciskam Ctrl-C, proces kończy się z wdziękiem i kończy się sesja ssh.
Jeśli jednak zamiast naciskać Ctrl-C, zabijam proces ssh za pomocą kill
polecenia (na przykład wysyłając SIGINT lub SIGHUP), ktserver
proces pozostaje aktywny.
Jak sprawić, by ktserver
zawsze umierali niezależnie od tego, jak ssh
zostanie zabity?
EDYCJA : Jeśli zamiast ktserver
uruchomić coś zupełnie innego, na przykład gedit
wszystko działa jak urok (tzn. Gedit umiera, gdy połączenie się kończy). Dlatego może być coś nie tak z samym procesem. Na przykład myślałem, że może to ignorować SIGHUP lub SIGINT. Jednak po uruchomieniu kill -1 ktserver
lub kill -2 ktserver
proces umiera zgodnie z oczekiwaniami.
EDYCJA 2 : Jak zauważa Mark Plotnick, problem związany jest z faktem, że na kanale ssh nie ma komunikacji. Potwierdziłem, uruchamiając ssh -t <host> read
i zabijając później proces ssh. read
wciąż żył i kopał.
kill -9 ktserver
?ssh example.com dd ...
pracy biec do końca, nawet po godzinachssh
matryc połączeń ze względu na problemy z siecią. Jeśli możesz zmienićktserver
opcję, aby od czasu do czasu wypisać coś, może to być obejście problemu.read
na komputerze zdalnym i po zabiciu połączenia sshread
nie umarłem. Niestety nie mogę zmienić ktserver na cokolwiek wyjściowego. Nie ma więc rozwiązania?shopt -s huponexit
). Czy możesz sprawdzić, czy to działa dla Ciebie?Odpowiedzi:
Zwykle, gdy połączenie ssh umiera, powłoka również umiera. Możesz skonfigurować swoją powłokę, aby wysyłała sygnał -1 (SIGHUP), gdy kończy się na wszystkich swoich potomkach.
W przypadku basha możesz skonfigurować tę opcję za pomocą wbudowanego polecenia shopt . (
shopt -s huponexit
).Dla zsh chcesz .
setopt
HUP
źródło
ssh -t -t
(zauważ-t
dwa razy!), Który wymusza alokację tty, a nie tylko pty.Przekonałem się, że po prostu użyłem tego
-t -t
argumentu, abyssh
działał. Nie musiałem ustawiaćhuponexit
ani początkowej, ani zdalnej powłoki.Testowałem to w następujący sposób:
Nie działa:
To zabiło sesję ssh, ale widzę, że proces uśpienia wciąż działa na zdalnym hoście (
ps -ef | grep sleep
pokazuje).Działa:
To zabija sesję ssh i proces zdalnego uśpienia również został zabity. Sprawdziłem również, że sygnał wysyłany do zdalnego procesu jest,
SIGINT
jeśli używasz Control- C. Sprawdziłem również, że SIGKILL (-9) zastosowany dossh
procesu zabije również proces zdalny.EDYCJA 1:
Tak było w przypadku
sleep
... dla bardziej upartych procesów zdalnych, zauważyłem, żessh
obsługuje ^ C inaczej niż SIGINT. Ctrl- Cpracował, ale niekill -INT $pid
zrobiłOto, co w końcu wymyśliłem, co zadziałało dla mojej faktycznej aplikacji (kradzież z innych odpowiedzi).
Zwróć uwagę na zagnieżdżone użycie podwójnych cudzysłowów i pojedynczych cudzysłowów. Pamiętaj, że twój zdalny proces MUSI odpowiedzieć na SIGHUP, faktycznie wychodząc!
źródło
cat
. Na przykładssh -ttq user@host '{ cmd; cmd; } | cat'
Ctrl-C
NIE zawsze jest równoważne zkill -INT $pid
, zobacz moją odpowiedź na unix.stackexchange.com/questions/377191/... i kolejną na stackoverflow.com/questions/8398845/... dla krwawych szczegółów ;-)^C
wysyła SIGINT . Jaka jest dokładna różnica, jeśli nie są równoważne?Jeśli ssh nie propaguje sygnałów, otrzymuje to, czego się od niego oczekuje?
UPD. (specjalne dla JosephR): to oczywiście sam błąd, który wynika z nieporozumienia - „Zabij proces odradzany przez ssh, gdy ssh umiera”. SSH zwykle nie spawnuje procesów (czasem tak jest, ale to inna historia), zamiast tego SSHD robi to, gdy patrzymy na drugą stronę połączenia. SSH opiera się jedynie na abstrakcji pseudoterminalnej. Dlatego jedyną rzeczą, która może pomóc, jest zdolność terminalu do wysyłania sygnałów do dołączonych procesów. Jest to nieco bardzo podstawowe dla każdego systemu podobnego do UNIX.
źródło
Rozwiązanie opublikowane tutaj nie działało dla mnie, ale ponieważ to pytanie pojawiło się jako pierwsze, gdy szukałem rozwiązania podobnego problemu, a także
-t -t
wspomniano tutaj sztuczkę, opublikuję rozwiązanie, które działało dla mnie, aby inni mogli spróbować.Moje długo działające polecenie już nie działało, gdy połączenie zostało zakończone w ten sposób.
źródło