Bir ssh oturumundan çalıştırılan programlar bağlantıya mı bağlı?


29

Bir ssh oturumundan çalıştırılan bir program müşteriyle olan bağlantıya bağlı mıdır? Örneğin, bağlantı gerçekten yavaş olduğunda. Peki, ekranda bir şeyler yazdırılana kadar aktif olarak bekliyor mu?

Bağlantıya bağlıysa , örneğin ekran veya byobu ile de oluyor mu? Çünkü bunlarla programlar ana bilgisayar bağlantısını kestikten sonra bile çalışmaya devam eder.


Not: Sadece bu ilgili soruları buldum:


1
Bağlantınız koparsa, program oturum zaman aşımına uğrayana kadar çalışmaya devam eder (yazdırma işleminde takılı kalmazsa), ancak oturumunuz sona ererse programın zarafetle sonlandırılacağını unutmayın.
Sebb,

Yanıtlar:


26

Programların çıktısı arabelleğe alınır, böylece bağlantı yavaşsa, arabellek dolarsa program durdurulur.

Eğer kullanırsanız screen, bunun bağlı bir oturuma denemek ve ekran için kullandığı yanı bir tampon vardır. Ama ekran oturumda bağlanan bir program olacak değil eğer durdurulması screenkutu uzak terminal hızlı yeterince güncelleme değil. Tıpkı bir bağlantı koptuğu zamanki gibi, program screensdoluncaya kadar dolmaya devam eder (en eski bilgiyi dışarı atar). Geldiğini görüyorsunuz (ve geri dönebilir), o tamponda ne olduğuna (hala) bağlı. screenProgramınızı terminalinizden (ve yavaş SSH bağlantınızdan) etkili bir şekilde ayırın.


9

Temel TCP bağlantısı RST bayrağıyla bir paket alırsa, bir SSH bağlantısı erken ölebilir . Bir taraf bir paket gönderirse (bu, periyodik bir SSH koruyucu probu olabilir) ancak makul bir süre içinde bir TCP onayı almazsa veya bir yönlendirici bağlantının çok uzun süre boşta kaldığına karar verirse veya bir ISS sadece kötülük oluyor.

Unix terminal modelinde, terminal bağlantısı kesildiğinde, terminal sürücüsü , kabuğuna bir HUP sinyali gönderir , bu da sonlandırması kabuğun içinde çalışan işlemlere bir SIGHUP gönderilmesine neden olur.

Gönderen Unix Programcı SSS , madde 1.15:

SIGHUP"Terminal hattı kapatıldı" anlamına gelen bir sözleşmedir. Ana işlemler ile ilgisi yoktur ve genellikle tty sürücüsü tarafından üretilir (ve ön plan işlem grubuna gönderilir).

Ancak, oturum yönetim sisteminin bir parçası olarak, SIGHUPbir sürecin ölümüyle ilgili tam olarak iki vaka gönderilir:

  • Ölen süreç, bir terminal cihazına bağlı bir oturumun oturum lideri olduğunda, SIGHUPbu terminal cihazının ön plan işlem grubundaki tüm işlemlere gönderilir.

  • Bir sürecin ölümü neden olduğunda bir süreç grubu artik duruma etmek ve yetim gruptaki bir veya daha fazla süreçler vardır durdu , sonra SIGHUPve SIGCONTyetim grubun tüm üyelerine gönderilir. (Artık bir işlem grubu, gruptaki hiçbir işlemin aynı oturumun parçası olan ancak aynı işlem grubunun parçası olmayan bir ebeveyne sahip olmadığı bir gruptur.)

SIGHUP için varsayılan sinyal işleyici sürecini sonlandırmak için geçerli:

Signal     Value     Action   Comment
----------------------------------------------------------------------
SIGHUP        1       Term    Hangup detected on controlling terminal
                              or death of controlling process

Yine de işlem sonlandırmasından kaçınmak mümkündür.

  • SIGHUP'ı görmezden gelen bir sinyal işleyici ekleyebilirsiniz. Bunu kullanıcı olarak yapmak için komutu içine alın nohup. Örneğin:

    nohup make all &
    
  • Kabuğa bir çocuk sürecini ondan ayırmasını söyleyebilirsiniz. Örneğin, Bash'in disownyerleşik bir komutu vardır:

    make all
    

    CtrlZ

    bg
    disown %1
    

    O zaman, SIGHUP çocuğa yayılmaz (artık çocuk değildir).

  • Bazı programlar, özellikle de ödemeler , yukarıdaki mekanizmaları otomatik olarak kullanır: bir program, alternatif bir SIGHUP işleyicisi yükleyebilir (kullanarak sigaction(2)) veya yeni bir oturuma katılmayı seçebilir ( setsid(2)).
  • Kaçabilirsiniz screenveya tmuxsahte TTY'yi ayırır hangi zaman SSH bağlantısı ölür SIGHUP almaz bir kabuk ile bir oturum çalıştırmak için. SIGHUP, SSH oturumundan ekran / tmux oturumuna aktarılmaz.

Bu arada, güvenilmez SSH bağlantılarıyla baş etmenin alternatif bir yolu da Mosh protokolünü kullanmak. Mosh, UDP üzerinden çalışıyor, bu nedenle sıfırlanma riskini taşıyan TCP bağlantısı yok.



1

Evet, SSH üzerinden çalışan bir program çıktılarının bir yere gitmesine bağlı olacaktır. Bağlantı yavaşsa, çıktı bir yerde tamponlanmalıdır ve tamponlar sonsuz olamaz, bu nedenle program doluysa engellemelidir.

Çıktının mutlaka bir terminale gitmeyebileceğini unutmayın: gibi bir şey çalıştırmayı düşünün

ssh user@somewhere "cat file.txt" > file.txt

Bu aslında dosyayı kopyalayacaktır. Bunun çalışması için, kedinin çıkış hızı, bağlantınınkiyle eşleşmelidir: çıktının parçalarının ortasından kaybedilmesinin kabul edilemez olduğu açık olmalıdır.

Ekran, terminal gibi davranması durumunu değiştirecek ve "terminal penceresinde" gösterilmesi gerekenleri (artı kaydırma) gösterecektir. Programınızın çıktılarını, yalnızca "pencereye" ve kaydırma işlemine uyacak parçaları hatırlamaya gerek yok. Varsayılan olarak, ekran yavaş bir bağlantı bekleyecektir (programı engelleme), ancak "engellemeyi kaldır" özelliğini ayarlayarak sıkışmış bir bağlantıyı tespit etmek üzere yapılandırılabilir.

Man sayfasından:

nonblock [on | off | numsecs]

Ekrana çıkışı kabul etmeyi bırakan kullanıcı arayüzleri (ekranlar) ile nasıl başa çıkılacağını söyleyin. Bir kullanıcı ^ S tuşuna basarsa veya bir TCP / modem bağlantısı kesilirse, ancak hiçbir bağlantı alınmadığında bu durum oluşabilir. Engelleme kapalı değilse (varsayılan değerdir) ekranı çıkışı kabul etmek için yeniden başlatılıncaya kadar ekran bekler. Engelleme açık değilse, ekran zaman aşımına ulaşana kadar bekler (açık 1 saniye olarak kabul edilir). Ekran hala karakter alamıyorsa, ekranda "engellenmiş" sayılır ve karakterleri göndermeyi durdurur. Bir zaman karakterleri kabul etmek için yeniden başlarsa, ekran engeli kaldırır ve güncellenmiş pencere içeriğini yeniden görüntüler.

Bağlantı kesilmesi yavaş bağlantıdan farklıdır. Düz SSH otomatik olarak ondan kurtaramaz, bu nedenle programınız bir SIGHUP alır. Öte yandan, ekran bir bağlantı kesilmesi tespit eder, ekran yeniden takılana kadar ayırır ve yerel arabelleğe geri döner. Bu olacak değil çalışan programı bloke ederler.

(Ayar nonblock 1Sepetinde .screenrcEğer sürekli aynı anda ağa konuşmak gerekir hala çıktı üretmekle kalmaz olacak irssi gibi bir şey çalıştırırsanız önemlidir. Son derece rahatsız edici IRC, kopuk alma yol açacak engelleniyor ...)

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.