Ssh öldüğünde ssh tarafından ortaya çıkmış süreci öldür


23

Bu, yalnızca burada değil, aynı zamanda yığın değişim ağının diğer sitelerinde de birkaç kez ele alınan bir sorudur (örneğin , ssh'ın kendisini kestiğimde uzak işlemi öldürmek için ssh nasıl yapılır? ). Ancak, çözümlerin hiçbirinin benim için çalışmasını sağlayamıyorum.

Ssh ile bir komut çalıştırıyorum. Her ssh'den çıktığımda, komutun da ölmesini istiyorum. Bu komut, Ctrl-C tuşlarına basana kadar süresiz çalışan ktserver adında bir servistir.

Aşağıdaki gibi çalıştırıyorum: ssh -t compute-0-1 ktserverve gerçekten de, Ctrl-C'ye bastığımda, işlem incelikle biter ve ssh oturumu sona erer.

Bununla birlikte, eğer Ctrl-C'ye basmak yerine, killkomutu kullanarak (örneğin, SIGINT veya SIGHUP göndermek) ssh işlemini öldürürsem , ktserversüreç canlı kalır.

Nasıl yapabilir ktservernasıl hep kalıp bağımsız sshöldürüldü?

EDIT : Eğer, ktservertamamen farklı bir şeyi çalıştırmak yerine gedit, her şey bir cazibe gibi çalışırsa (yani, bağlantı öldüğünde gedit ölür). Bu nedenle, işlemin kendisinde bir sorun olabilir. Örneğin, SIGHUP veya SIGINT'i görmezden gelebileceğini düşündüm. Bununla birlikte, koştuğumda kill -1 ktserverveya kill -2 ktserverçalıştığımda işlem beklendiği gibi ölüyor.

EDIT2 : Mark Plotnick'in işaret ettiği gibi, mesele, ssh kanalında dolaşan hiçbir iletişim olmadığı gerçeğiyle ilgilidir. Daha ssh -t <host> readsonra ssh işlemini çalıştırarak ve öldürerek onayladım . readhala hayatta ve tekmeliyordu.


Denedin kill -9 ktservermi

@HermanTorjussen Tabii, işe yarıyor. Sorun şu ki, bu komut başka bir işlemin içinden çalıştırılıyor ve işlemimin ölmesine neden olabilecek tüm olasılıkları ve dolayısıyla bununla ilgili ssh oturumunu kontrol edemeyebilirim. Bu yüzden, işlemim ne zaman ve dolayısıyla sona erdiğinde, ktserver'ın onlarla birlikte öleceğinden emin olmak için bazı güvenilir yollara ihtiyacım var.
GermanK

Linux ile olan deneyimim, eğer uzak komut ölü tcp bağlantısına herhangi bir giriş yapamazsa, çalışmaya devam edeceğidir. Ben yaşadım ssh example.com dd ...sonra tamamlanması bile saate çalıştırmak işleri sshnedeni ağ sorunları bağlantı ölür. Bir ktserversüre içinde bir şey çıktısı alma seçeneğini değiştirebilirseniz , bu bir geçici çözüm olabilir.
Mark Plotnick

@MarkPlotnick Gerçekten de, readuzak bilgisayarda koşmayı denedim ve ssh bağlantısını öldürdükten sonra readölmedi. Ne yazık ki, ktserver herhangi bir şey çıktısını değiştiremezsiniz. Öyleyse çözüm yok mu?
GermanK

2
Ssh öldüğünde kabuğunun da öldüğünü varsayarım. Kabuğunuzu, sonlandırıldığında -1 (SIGHUP) sinyali gönderecek şekilde yapılandırabilirsiniz. ( shopt -s huponexit). Bunun senin için işe yarayıp yaramadığını test edebilir misin?
Hennes,

Yanıtlar:


13

Genellikle ssh bağlantısı öldüğünde kabuk da ölür. Kabuğunuzu, tüm çocuklarına son verdiğinde -1 (SIGHUP) sinyali gönderecek şekilde yapılandırabilirsiniz.

Bash için bu seçeneği builtit komut shopt ile yapılandırabilirsiniz . ( shopt -s huponexit).

İstediğin zsh için .setoptHUP


Bunun şu anki sorunumun cevabı olduğunu sanıyordum ama işe yaramadı. Çalıştırıyorum: ssh $ host "scp LargeFile.dat $ $ OtherHost: / tmp" & pid = $! ve sonra bu aktarımı durdurmaya çalışıyor: shopt -s huponexit; $ pid öldürmek, ancak başlattığım ssh'yi öldürdüğümde scp durmuyor. Düşüncesi olan var mı?
David Doria

Scp komutuna başlamadan önce ayarlanan kabuk seçenekleriyle test yapabilir misiniz ? Veya bir kabuk başlatarak, shopt ayarlayıp scp'ye başlatarak mı?
Hennes

2
Bu benim için işe yarıyor, ancak ilk önce sadece küçükden çok tty tahsisini zorlayan ssh -t -t( -tiki kere dikkat !) Kullandığımdan emin olmam gerekiyordu .
Nicolas Wu

13

Bunu sadece çalışmasını -t -tsağlamak için bir argüman olarak kullanarak buldum ssh. huponexitKaynak veya uzak kabuğa ayarlamak zorunda değildim .

Bunu şu şekilde test ettim:

Çalışmıyor:

ssh user@remote sleep 100
^C

Bu ssh oturumunu öldürdü, ancak uyku sürecinin hala uzaktaki ana bilgisayarda çalıştığını görebiliyorum ( ps -ef | grep sleepgösteriyor).

Çalışır:

ssh -t -t user@remote sleep 100
^C

Bu ssh oturumunu öldürür ve uzaktan uyku işlemi de öldürüldü. Ben de uzaktan sürecine gönderilir sinyal olduğunu doğruladıktan SIGINTkullanırsanız Control- C. Ayrıca, sshişleme uygulanan SIGKILL'in (-9) uzak işlemi de öldüreceğini doğruladım .

EDIT 1:

Bu ,sleep inatçı uzak süreçler için doğruydu ssh, SIGINT'den farklı şekilde ^ C işlediğini buldum . Ctrl- Cçalıştı, ama kill -INT $pidolmadı

İşte sonunda uygulamam için çalıştığım (diğer cevaplardan çalan).

ssh -t -t -i id_rsa user@mic0 "/bin/sh -O huponexit -c 'sleep 100'"

Yuvalanmış çift tırnak ve tek tırnak kullanın. Uzaktaki işleminizin SIGHUP'a gerçekten çıkarak yanıt vermesi GEREKİR!


Bu benim için en iyisi oldu, ancak FYI ayrıca terminal kontrol karakterlerinin sızmasına neden oldu; Yani, benim durumumdaki kolay geçici çözüm, çağrılan komutları kaydırmak ve çıktılarını iletmekti cat. Örneğin,ssh -ttq user@host '{ cmd; cmd; } | cat'
Droj

Ctrl-Cher zaman eşdeğer değildir kill -INT $pid, benim cevap bakınız unix.stackexchange.com/questions/377191/... üzerine ve başka stackoverflow.com/questions/8398845/... ;-) kanlı detaylar için
thecarpy

@thecarpy - ilk cevabınız Ctrl-C'nin SIGINT'e benzer olduğunu ve diğer cevabın ^CSIGINT gönderdiğini söylüyor . Peki, eğer eşdeğer değilse, tam fark nedir?
Mark Lakata

1

Ssh sinyalleri yaymazsa, ondan ne beklersiniz?

UPD. (JosephR için özel): açık bir şekilde, yanlış anlaşılmanın ardından ortaya çıkan ve kendisinin söz konusu olduğu bir hatadır - "ssh öldüğünde ssh tarafından doğmuş olan süreci öldür". SSH genellikle süreçleri ortaya çıkarmaz (bazen yapar, ancak bu başka bir hikayedir), SSHD bunun yerine bağlantının diğer tarafına baktığımızda yapar. SSH, yalnızca uzak sunucunun sahip olduğu sözde terminal soyutlamaya dayanır. Bu yüzden, yardım edebilecek tek şey terminalin bağlı işlemlerine sinyal gönderme yeteneğidir. Bu, UNIX benzeri her sistem için biraz temeldir.


1
Bu soruya bir cevap vermiyor. Bir yazarın açıklamasını eleştirmek veya talep etmek için yazının altına bir yorum bırakın.
Anthon,

@Anthon, bu bir açıklama. Ancak bunu söyleyen hiç kimse, tek doğru cevap olmamalıdır. Aşağıdaki yorumunuz için teşekkür ederiz.
poige

1
@poige Belki açıklamayı patlatır, böylece OP'ye ve diğerlerine faydalı olabilir.
Joseph R.

@JosephR., Tamam, sadece senin için.
poige

1
"Sshd tarafından sshd bağlantısı koptuğunda ortaya çıkan süreci öldürme" dersem, size daha iyi gelir mi? Repra etmenin benim sorunumu çözdüğünü hiç sanmıyorum.
GermanK

0

Burada yayınlanan çözüm benim için işe yaramadı ama bu soru ilk önce benzer soruna bir çözüm ararken ve -t -tburada hileci olduğu zaman ortaya çıktığından beri , başkalarının denemesi için benim için işe yarayan bir çözüm yollayacağım.

ssh -t -t -o ControlMaster=auto -o ControlPath='~/test.ssh' your_remote_ip_goes_here "your_long_running_command" &
sleep 100
ssh -o ControlPath='~/test.ssh' -O exit your_remote_ip_goes_here

Uzun süredir devam eden komutum, bağlantı böyle sonlandırıldığında artık çalışmıyordu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.