Görüntüleme için bir işlem çıktısına ekleyin


112

Ne dediğini görebilmek için bir konsol / terminal görünümünü bir uygulama çıktısına nasıl 'ekleyebilirim'?

Uygulamayı sonlandırmadan bir uygulama çıktısından nasıl ayrılırım?

Normalde, komut satırını kullanarak konuşkan bir uygulamayı çalıştırırsanız, her türlü harika çıktıyı görürsünüz. Ancak, diyelim ki KINO gibi özellikle konuşkan bir programım çalışıyor ve komut satırından yeniden başlatmadan herhangi bir anda çıktısını görmek istiyorum. Yapamam; en azından nasıl olduğunu bilmiyorum.


1
İşleminizde hata ayıklama sembolü var mı? Üretim ortamında çalışıyor mu? Ve eğer öyleyse, ASLA duraklatılmamasına ihtiyacınız var mı?
yves Baumes

Kino gibi son kullanıcı programlarıyla ilgili kararlılık sorunlarım olduğunda (sesimi çöker ve keser), nasıl / neden çöktüğünü bilmek istiyorum, böylece düzeltmek için çalışabilirim. Bu geliştirdiğim bir program değil, sorun giderme için bilmek istediğim bir teknik. Önerinizi aşağıda deneyeceğim.
aggitan

Yanıtlar:


18

Burada birkaç seçenek var. Birincisi, komutun çıktısını bir dosyaya yeniden yönlendirmek ve ardından bu dosyaya eklenen yeni satırları gerçek zamanlı olarak görüntülemek için 'tail' kullanmaktır.

Diğer bir seçenek, programınızı bir tür metin tabanlı Terminal uygulaması olan 'ekran' içinde başlatmaktır. Ekran oturumları eklenebilir ve çıkarılabilir, ancak sözde yalnızca aynı kullanıcı tarafından kullanılması amaçlanmıştır, bu nedenle bunları kullanıcılar arasında paylaşmak istiyorsanız, bu büyük bir acıdır.


1
"Burada birkaç seçenek var. Bunlardan biri, komutun çıktısını bir dosyaya yeniden yönlendirmek ve ardından o dosyaya eklenen yeni satırları gerçek zamanlı olarak görüntülemek için 'tail' kullanmak." Bu zaten çalışan uygulamalarla yapılabilir mi?
aggitan

2
Çıktıyı dosyada yazıldığı gibi elde etmek için muhtemelen tail -f $ log_file'a ihtiyacınız vardır. Ayrıca hayır, zaten çalışan bir uygulamayla bunu yapmanın hiçbir yolu yok.
Varkhan

@aggitan: Hayır. Mevcut uygulamalar için onları yeniden başlatmanız gerekecek, çünkü G / Ç'lerini kontrol terminaline zaten bağladılar.
Don Werve


289

Sanırım burada daha basit bir çözümüm var. /procYolun altından erişilebilen sözde dosya sisteminin altında, adı aradığınız PID'ye karşılık gelen bir dizini arayın . Öyleyse, kimliği 1199 olan bir programınız varsa, cdiçinde:

$ cd /proc/1199

Ardından fdaltındaki dizini arayın

$ cd fd

Bu fddizin, programınızın kullandığı dosya tanımlayıcı nesnelerini (0: stdin, 1: stdout, 2: stderr) ve sadece tail -fihtiyacınız olanı - bu durumda stdout) tutar:

$ tail -f 1

9
Kullandığım edemedi tailçıktı girişi için başka bir işlem yeniden yönlendirildi benim durumumda olduğu gibi, ama morebana güncel verileri gösterdi.
Ωmega

10
Bu sitedeki en sürükleyici mesajlardan biri!
robert

2
morebenim için çalışıyor. düğüm işleminde ubuntu 14.04
Shih-Min Lee

1
Bu benim için System.out.println'i çağıran bir java işlemi ile çalışmıyor. / Proc / [pid] / fd / 1 için hiç çıktı yok
Nick

1
Aşağıdakini kullanarak bir reprodüksiyon oluşturmaya çalıştım, ancak boşuna: `` `` docker run -it --name container1 ubuntu bash -c -i "COUNT = 0; while true; do echo Dans pistinin ritmini devam ettir; (( COUNT ++)); uyku 1; echo \ "Sayı: \ $ {COUNT} \"; bitti; " `` Başka bir terminalde: `` docker exec -it container1 tail -f / proc / 1 / fd / 1 ''
JacobWuzHere

54

Ben de aynı şeyi arıyordum ve yapabileceğinizi buldum:

strace -ewrite -p $PID

Tam olarak ihtiyacın olan şey değil, ama oldukça yakın.

Yönlendirme çıktısını denedim ama bu benim için işe yaramadı. Belki de işlem bir sokete yazdığı için, bilmiyorum.


teşekkürler çalışıyor, ancak çıktı kesildi, örneğin ping: write (1, "1.0.0.1'den 64 bayt: icmp_seq =" ..., 56) = 56
izy

8

Ne dediğini görebilmek için bir konsol / terminal görünümünü bir uygulama çıktısına nasıl 'ekleyebilirim'?

Bu soru hakkında, processus'u başlatmadan önce sceen komutunu çalıştırmamış olsanız bile çıktıyı yakalamanın mümkün olduğunu biliyorum.

Hiç denememiş olsam da, GDB'yi nasıl kullanacağınızı (ve işleminizi yeniden başlatmadan) açıklayan ilginç bir makale buldum.

çalışan bir işlemin çıktısını yeniden yönlendirme

Temel olarak:

  1. / Proc / xxx / fd sayesinde işleminiz için açık dosya listesini kontrol edin
  2. Sürecinizi GDB ile ekleyin
  3. Duraklatıldığında, ilgilendiğiniz dosyayı kapatın, close () işlevini çağırın (GDB'de işleminizin herhangi bir işlevini yapabilirsiniz. Sürecinizde hata ayıklama sembollerine ihtiyacınız olduğundan şüpheleniyorum ..)
  4. Create () veya open () işlevini çağıran yeni bir dosya açın. ( Sondaki yorumlara bir göz atın , aynı tutamacın kullanımda olmasını sağlamak için insanların dup2 () kullanmayı önerdiğini göreceksiniz)
  5. İşlemi ayırın ve çalışmasına izin verin.

Bu arada, i386 kutusunda bir linux işletim sistemi çalıştırıyorsanız, yorumlar çıktıyı yeni bir konsola yönlendirmek için daha iyi bir araçtan bahsediyor: 'retty' . Eğer öyleyse, kullanımını düşünün.


6

Benim için bu işe yaradı:

  1. İşlemin sahibi olarak giriş yapın ( rootizin bile reddedildi)

    ~$ su - process_owner
    
  2. Diğer birçok cevapta belirtildiği gibi dosya tanımlayıcısını kuyruklayın.

    ~$ tail -f /proc/<process-id>/fd/1 # (0: stdin, 1: stdout, 2: stderr)
    

2

Yerel olarak çalıştırılan bir yum yükseltme sürecini uzaktan izlemek istedim, bu yüzden muhtemelen bunu yapmanın daha verimli yolları varken, işte şunu yaptım:

watch cat /dev/vcsa1

Açıkçası, hangi terminalin kullanıldığına bağlı olarak vcsa2, vcsa3, vb. Kullanmak istersiniz.

Terminal pencerem komutun çalıştırıldığı terminalle aynı genişlikte olduğu sürece, her iki saniyede bir mevcut çıkışlarının anlık görüntüsünü görebiliyordum. Başka bir yerde önerilen diğer komutlar benim durumum için pek işe yaramadı, ancak bu hile yaptı.

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.