SSH -t arka plan süreçlerini neden beklemiyor?


13

Neden ssh -tarka plan işlerinin bitmesini beklemiyor?

Misal:

ssh user@example 'sleep 2 &'

Ssh 2 saniye sonra döndüğü için bu beklendiği gibi çalışır.

ssh user@example -t 'sleep 2 &'

sleepbitmesini beklemez ve hemen geri döner.

Bunun nedenini kimse açıklayabilir mi? Geri ssh -tdönmeden önce tüm arka plan işlemlerinin bitmesini beklemenin bir yolu var mı ?

Benim kullanım durumum ile bir komut dosyası başlatmak ssh -tve bu komut dosyası ana komut dosyası bittikten sonra hayatta kalması gereken birkaç arka plan işleri başlar olmasıdır. Bununla ssh -tşimdiye kadar mümkün değil.

Yanıtlar:


22

Olmadan -t, sshduzak kabuk (ve çocuklar gibi sleep) ve stderr stdout iki boru üzerinden alır (ve ayrıca müşterinin girişini başka bir boru yoluyla gönderir).

sshd kullanıcının oturum açma kabuğunu başlattığı işlemi beklemekle kalmaz, aynı zamanda bu işlem stdout borusunda (en azından opensh durumunda stderr borusunu değil) eof bekler.

Ve eof, borunun yazma ucunda açık olan herhangi bir işlemin dosya tanımlayıcısı olmadığında olur, bu genellikle yalnızca stdout'ları başka bir şeye yönlendirilmeyen tüm işlemler gittiğinde gerçekleşir.

Kullandığınızda -t, sshdboru kullanmaz. Bunun yerine, uzak kabuk ve çocuklarıyla tüm etkileşimler (stdin, stdout, stderr) bir sahte terminal çifti kullanılarak yapılır.

Bir yalancı terminal çifti sshdile, ana taraf ile etkileşim için , yalancı terminalin bağımlı tarafına açık fds ile hala işlem olup olmadığını bilmek için benzer bir işlem veya herhangi bir yol yoktur, bu yüzden sadece sonlandırılmasını bekler uzak kullanıcının oturum açma kabuğunu yürüttüğü ve sonra çıktığı işlem.

Bu çıkıştan sonra, pty çiftinin ana tarafı kapatılır, bu da pty'nin yok edildiği anlamına gelir, bu nedenle köle tarafından kontrol edilen süreçlere bir SIGHUP (varsayılan olarak onları sonlandıracaktır) verilir.


1
kapsamlı cevap için teşekkürler! bilmek istiyorum başka bir şey: sözde terminal çıktıktan sonra tüm arka plan işlemleri sona erer mi? başladığım komut ssh ile iyi çalışan bir hizmet başlatır. ancak ssh -t kullanılırken hizmet başlatılmaz. ssh döndükten sonra hizmet kapanıyor gibi görünüyor.
Philipp Murry

Aslında, sözde terminalin ana tarafının tüm bağımlı dosya tanımlayıcılarının ne zaman kapatıldığını bilmesi için bir yol vardır. Aslında, tüm dosya tanımlayıcıları kapatıldığında gerçek bir terminal tarafından tetiklenen aynı mekanizmadır.
JdeBP


@JdeBP, genişletmek ister misiniz? Neyi kastettiğinden emin değilim. AFAICT terminal emülatörleri (en azından xterm ve gnome-terminali), kabuğu
kalıpta yürüttükleri

@PhilippMurry nohupBir komut dosyasının böyle çalışmasını sağlamak için kullanabilirsiniz . (Ayrıca içinde uzun süredir devam eden işlere başlamayı düşünebilirsiniz, tmuxböylece ilerlemelerini etkileşimli olarak izleyebilirsiniz, ancak bir günlük dosyası iyi çalışır.)
jpaugh

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.