Korzystam z poniższego polecenia i monitoruję plik wyjściowy w innym systemie:
ssh $ip_address 'for n in 1 2 3 4 5; do sleep 10; echo $n >>/tmp/count; done'
Jeśli zabiję komendę ssh za pomocą ^C
lub po prostu zabijając terminal, na którym jestem zalogowany, oczekiwałbym, że zdalne polecenie również się zakończy. Tak się jednak nie dzieje: /tmp/count
niezależnie pobiera wszystkie liczby 1–5 i ps -ejH
pokazuje, że powłoka i jej sleep
dziecko nadal działają.
Czy jest to oczekiwane zachowanie i czy jest gdziekolwiek udokumentowane? Czy mogę to wyłączyć? Po przeczytaniu, spodziewałem się, że będę musiał wyraźnie włączyć takie zachowanie bez nohup, nie żeby było to ustawienie domyślne.
Przejrzałem strony podręcznika dla ssh i sshd, ale nie zauważyłem niczego oczywistego, a Google wskazuje mi instrukcje dotyczące włączania tego zachowania, a nie wyłączania go.
Korzystam z systemu Red Hat Enterprise Linux 6.2 z loginem root i powłoką bash na obu systemach.
-tt
zamiast,-t
jeśli sam ssh nie ma przydzielonego tty. SSH nie otrzyma przydzielonego tty, jeśli ssh zostanie natychmiast uruchomione w tle po wywołaniu za pomocą opcji takich jak-f
lub-n
.Spróbuj przydzielić
ssh
komendę psuedo-tty .ssh -t $ip_address 'for n in 1 2 3 4 5; do sleep 10; echo $n >>/tmp/count; done'
Po odłączeniu sesji ssh proces powinien zostać zakończony.
Ponieważ jest to pseudo-tty, inicjalizacja powłoki prawdopodobnie nie spowoduje źródłowych plików konfiguracyjnych, pozostawiając polecenie w bardzo czystym środowisku. Może być konieczne skonfigurowanie
.ssh/environment
pliku, który definiuje zmienne środowiskowe, takie jak PATH. Odman 1 ssh
źródło
Alternatywą do użycia
-t
opcji,ssh
aby zdalne polecenie zakończyło się possh
wyjściu klienta (lub zabiciu), nazwanego potoku można użyć do konwersji „EOF na SIGHUP”, gdy standardowe wejściesshd
jest zamknięte (patrz Bug 396 - sshd osierocone procesy, gdy nie ma przydzielonego pty ).źródło
To najlepszy sposób, w jaki udało mi się to zrobić. Chcesz czegoś po stronie serwera, które próbuje odczytać standardowe wejście, a następnie zabija grupę procesów, gdy to się nie powiedzie, ale chcesz również standardowe wejście po stronie klienta, które blokuje się, dopóki proces po stronie serwera nie zostanie zakończony i nie pozostawi długotrwałych procesów takich jak <( nieskończoność snu).
Wydaje się, że tak naprawdę nigdzie nie przekierowuje standardowego wejścia, ale działa jako wejście blokujące i pozwala uniknąć przechwytywania naciśnięć klawiszy.
Odpowiedni błąd openssh: https://bugzilla.mindrot.org/show_bug.cgi?id=396#c14
źródło
Jeśli chcesz wyłączyć to (pozornie domyślne zachowanie), musisz włączyć ssh-keep-alive po stronie klienta lub serwera.
Jeśli spojrzysz na opcje ssh-keep-alive na stronach podręcznika man, zobaczysz, że są one domyślnie wyłączone.
źródło
Moja odpowiedź jest oparta na teru. Potrzebuję skryptu pomocniczego
~/helper
na serwerze server.ip:Jeśli nazywa się to np. Za pomocą
i wykonuje się
echo hello from server
na server.ip, a następnie klient ssh zostanie zakończony.Jeśli nazywa się to np. Za pomocą
kill -9 $CHID
zatrzyma również skrypt na serwerze. Dla mniekill -INT $CHID
nie działa, ale nie wiem dlaczego.W odpowiedzi teru polecenie ssh będzie czekać wiecznie po zakończeniu polecenia zdalnego, ponieważ
cat
nigdy się nie kończy.Wszystkie odpowiedzi z ssh -t nie działały dla mnie
kill
, ale tylko z Ctrl-C.Edycja: Dowiedziałem się, że działało to od nowego Ubuntu 14.01 do starszego naukowego systemu Linux - ale nie na odwrót. Dlatego myślę, że nie ma ogólnego rozwiązania. Dziwne.
źródło