Vazgeçilen ve terminalini kaybeden bir sürecin çıktısına ne olur?


26

Sanal bir terminali kapatırsam, bazı işlemlerin başlatıldığı yer çıktı doğrudan gider /dev/nullmi yoksa belleği bir şekilde kirletebilir mi? Yine de herhangi bir noktada okumaya devam etmek için çıktıyı alabilir miyim?

[EDIT]: Öyleyse, bir süreci etkin bir şekilde reddetme anı, çıktısını kontrol etme gücümün bir sonu mu?

Ayrıca, durdurulan bir süreci reddedersem ilk başta her şeyin normal göründüğünü fark ettim: ne sonlandırılıyor ne de işlerde gösteriliyor. Ben (ve Oturumu Ama eğer yok yakın terminal, sadece çıkış anlamına suörneğin), süreç sonlandırılır. Aynı şekilde, arka planda çalışan ve reddedilen bir işlem de çalışmaya devam edebilir.


2
“Çıktıyı her şekilde alabilir miyim?” İçin: kirli numaralar olmadan. Ancak bkz: Çalışan bir işlemi nasıl reddedebilir ve yeni bir ekran kabuğuyla ilişkilendirebilirim? ve kirli numaralar için belirtilen diğer sorular (tümü programa bir hata ayıklayıcı eklemek ve bir şekilde onu farklı bir çıktı dosyasını açmak için kullanmaya dayanarak).
Gilles 'SO- kötülük yapmayı bırak'

Bu sorunun bağlantısı için teşekkürler. Bana şu ana kadarki en iyi cevabı verdi! Özellikle akıllı rettyprogram.
rozcietrzewiacz

1
Ayrıca , ilgili bir soru için bu cevaba bakınız .
Stéphane Gimenez

Yanıtlar:


11

Bir sürecin "reddedilmesi" gerçeği, bu süreci oluşturan etkileşimli kabuk için yalnızca bir anlama sahiptir. Bu, kabuğun işleri tablosuna işlemi (artık) içermemesi ve kabuk çıkarken SIGHUP'ın bu işleme gönderilmeyeceği anlamına gelir. Gerçekten sorularınızla ilgili değil.

Silinen bir sanal terminale gönderilen çıktılara ne olduğu hakkında: Bazı testler kendim yaptım ve /dev/pts/xcihazların erişilebilir olmadığını ve kendilerine işaret eden tüm dosyalayıcılar kapatılıncaya kadar tekrar tahsis edilmediğini fark ettim . Bu nedenle, silinmiş bir terminale yazma işleminin kaydedilmesinin bir nedeni göremiyorum. Sanırım bu POSIX tarafından bile tanımlanmadı.

Bir terminale yazan bazı işlemlerin çıktısını almak konusunda, terminal hala canlı olsa bile bunun mümkün olduğunu sanmıyorum. Tek yapabileceğiniz tek şey terminale doğrudan giriş kapmaktır (yani tuş vuruşlarını veya bir pty'nin ana kısmı tarafından yapılan tuş vuruşlarını). İşlemler stdin üzerinden terminallerine yazılanları okuyacak olsaydı, bu çoğu işlem için kendi kendine bir döngüye yol açardı.

İşlem sonlandırması konusundaki son sözler hakkında ne olduğunu tam olarak bilmiyorum, ancak oturum sırasında işlem gruplarının ön plan / arka plan durumuna ilişkin sinyallerle (SIGTTOU, SIGTTIN, SIGHUP veya diğerleri) ilgili garip davranışlardan şüpheleniyorum. lider çıkar (örneğin su, bahsettiğiniz durumda).

Düzenlemeye Cevap : Hayır, çıktıyla ilgili olarak, bir işlem reddedildiğinde hiçbir şey değişmez: hala kontrol terminaline eklenir (zaten zaten daemonlar gibi kendiliğinden ayrılmadığı sürece). Bunu kullanarak görebilirsiniz ps. Bununla birlikte, bu işlem için artık kabuk tarafından sağlanan fg/ bg/ jobskomutlarını kullanamazsınız . Bu, terminalden gelen girdilerle beslenmenin zor olabileceği anlamına gelir (ön plan işlem grubunda olması gerekir).

-
1. Süreç bazı hata ayıklama araçlarına istekli ya da kaçırılmadığı sürece (yukarıdaki yorumlara bakınız).


1
Bunu açıklığa kavuşturduğunuz için teşekkürler. Aslında bir süreci reddetme gerçeği hala benim sorumla ilgili: Bir süreci reddettiğimde, çıktılarını kontrol etme yeteneğini yitiriyor gibiyim, değil mi? (Terminal nit kapatılsa bile.) Bu durumu eklemek için soruyu düzenleyeceğim.
rozcietrzewiacz

4

Sadece bu özel soruyu ele almak için:

Bir işlemin başladığı sanal terminali kapatırsam, çıktı doğrudan / dev / null değerine mi gider, yoksa bir şekilde belleği kirletebilir mi?

Terminal ve ona bağlı program (lar) bir tty aygıtı üzerinden bir dosya gibi okuyarak ve yazarak iletişim kurar. Spesifik olarak, bir sanal terminal bir "sözde-tty" (kısaca "pty") yaratır ve daha sonra bir kabuk (veya başka) prosesi ortaya çıkarır ve bu prosesin stdin / out / err'in pty'ye bağlanır. (Ayrıntılar işletim sistemine göre değişir.)

Sanal terminali kapattığınızda, sanal terminal bağlantının sonunu kapatır (pty "master"). Bundan sonra, bağlantının diğer ucundaki program tty'ye yazarsa, bir hata döndürülür ve veriler hiçbir yere gitmez. Benzer şekilde, tty'den okursa bir EOF (dosyanın sonu) göstergesini geri alır.


Teşekkürler - biraz daha programlama açısından güzel ve net bir açıklama.
rozcietrzewiacz 04:11

3

Sorunuzun en ilginç bölümünü cevaplamak için: canlı çalışan bir programın çıktısını değiştirmek için dosya tanımlayıcılarını düzenlemeniz gerekir. Bu gdb ile yapmak oldukça kolaydır. Bu bir kesmek, ama işe yarıyor.

Görmek:

https://stackoverflow.com/questions/593724/redirect-stderr-stdout-of-a-process-after-its-been-started-using-command-line

Bir yardımcı komut dosyası http://users.linpro.no/ingvar/fdswap.sh.txt adresinde bulunabilir .


0

Gilles, bana bu soruyu işaret eden yorumuyla retty adında bir program öğrendim .

Etkili olup olmadığına bakılmaksızın, bir işlemin çıktısını okumaya devam etmeyi sağlayan etkin bir (sözde) kimliğe yeniden bağlamak için bazı kirli kesitler kullanıyor gibi görünüyor. Yani bu, sorumun ilk kısmına cevap veriyor gibi görünüyor. İkincisi Stéphane tarafından cevaplandı .

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.