Lampirkan ke keluaran proses untuk dilihat

111

Bagaimana saya 'melampirkan' konsol / tampilan terminal ke output aplikasi sehingga saya dapat melihat apa yang mungkin dikatakannya?

Bagaimana cara melepaskan dari keluaran aplikasi tanpa mematikan aplikasi?

Biasanya jika Anda menjalankan aplikasi yang banyak bicara menggunakan baris perintah, Anda akan melihat semua jenis keluaran yang bagus. Namun, katakanlah saya menjalankan pemrograman yang sangat cerewet, seperti KINO, dan saya ingin melihat outputnya pada saat tertentu tanpa memulai ulang melalui baris perintah. Saya tidak bisa; setidaknya saya tidak tahu bagaimana caranya.

aggitan
sumber
1
Apakah Anda memiliki simbol debug dalam proses Anda? Apakah itu berjalan di lingkungan produksi? Dan jika demikian, apakah Anda memerlukannya agar TIDAK PERNAH dijeda?
yves Baumes
Ketika saya mengalami masalah stabilitas dengan program pengguna akhir seperti kino (crash dan mematikan suara saya), saya ingin dapat mengetahui bagaimana / mengapa itu crash sehingga saya dapat bekerja untuk memperbaikinya. Ini bukanlah program yang saya kembangkan tetapi teknik yang ingin saya ketahui untuk pemecahan masalah. Saya akan mencoba saran Anda di bawah ini.
aggitan

Jawaban:

17

Ada beberapa opsi di sini. Salah satunya adalah mengarahkan output dari perintah ke file, dan kemudian menggunakan 'tail' untuk melihat baris baru yang ditambahkan ke file itu secara real time.

Pilihan lainnya adalah meluncurkan program Anda di dalam 'layar', yang merupakan aplikasi Terminal berbasis teks. Sesi layar dapat dipasang dan dilepaskan, tetapi secara nominal dimaksudkan hanya untuk digunakan oleh pengguna yang sama, jadi jika Anda ingin membaginya di antara pengguna, itu sangat merepotkan.

Don Werve
sumber
1
"Ada beberapa opsi di sini. Salah satunya adalah mengarahkan keluaran dari perintah ke sebuah file, dan kemudian menggunakan 'tail' untuk melihat baris baru yang ditambahkan ke file itu secara real time." Bisakah ini dilakukan dengan aplikasi yang sudah berjalan?
aggitan
2
Anda mungkin membutuhkan tail -f $ log_file untuk mendapatkan keluaran seperti yang tertulis di file. Juga, tidak, saya tidak tahu cara melakukannya dengan aplikasi yang sudah berjalan.
Varkhan
@aggitan: Tidak. Untuk aplikasi yang ada, Anda harus memulai ulang, karena mereka telah mengikat I / O mereka ke terminal pengendali.
Don Werve
287

Saya rasa saya memiliki solusi yang lebih sederhana di sini. Cari saja direktori yang namanya sesuai dengan PID yang Anda cari, di bawah sistem file semu yang dapat diakses di bawah /procjalur. Jadi jika Anda memiliki program yang sedang berjalan, dengan ID 1199, cdke dalamnya:

$ cd /proc/1199

Lalu cari fddirektori di bawahnya

$ cd fd

fdDirektori ini menyimpan objek file-deskriptor yang digunakan program Anda (0: stdin, 1: stdout, 2: stderr) dan hanya tail -fyang Anda butuhkan - dalam hal ini, stdout):

$ tail -f 1
licorna
sumber
9
Saya tidak dapat menggunakan tailkarena dalam kasus saya, output dialihkan ke proses lain untuk input, tetapi moremenunjukkan kepada saya data saat ini.
Ωmega
10
Salah satu postingan paling memukau di situs ini!
robert
2
morebekerja untuk saya. ubuntu 14.04 pada proses node
Shih-Min Lee
1
Ini tidak berfungsi untuk saya dengan proses java yang memanggil System.out.println. Tidak ada keluaran sama sekali ke / proc / [pid] / fd / 1
Nick
1
Mencoba membuat reproduksi menggunakan di bawah ini, tetapi tidak berhasil: `` docker run -it --name container1 ubuntu bash -c -i "COUNT = 0; while true; do echo Pertahankan ketukan lantai dansa; (( COUNT ++)); sleep 1; echo \ "Hitungan adalah: \ $ {COUNT} \"; selesai; " `` Di terminal lain: `` docker exec -it container1 tail -f / proc / 1 / fd / 1 ''
JacobWuzHere
54

Saya mencari hal yang persis sama dan menemukan bahwa Anda dapat melakukan:

strace -ewrite -p $PID

Ini tidak persis seperti yang Anda butuhkan, tetapi cukup mendekati.

Saya mencoba output pengalihan, tetapi itu tidak berhasil untuk saya. Mungkin karena prosesnya menulis ke soket, saya tidak tahu.

Paul Scheltema
sumber
terima kasih berhasil, tetapi keluaran terpotong, misalnya untuk ping: tulis (1, "64 byte dari 1.0.0.1: icmp_seq =" ..., 56) = 56
izy
8

Bagaimana saya 'melampirkan' konsol / tampilan terminal ke output aplikasi sehingga saya dapat melihat apa yang mungkin dikatakannya?

Tentang pertanyaan ini, saya tahu itu mungkin untuk menangkap output, bahkan ketika Anda tidak meluncurkan perintah sceen sebelum meluncurkan prosesnya.

Meskipun saya tidak pernah mencobanya, saya menemukan artikel menarik yang menjelaskan cara menggunakan GDB (dan tanpa memulai ulang proses Anda).

mengarahkan-keluaran-dari-proses-yang-berjalan

Pada dasarnya:

  1. Periksa daftar file yang terbuka untuk proses Anda, berkat / proc / xxx / fd
  2. Lampirkan proses Anda dengan GDB
  3. Saat dijeda, tutup file yang Anda minati, panggil fungsi close () (Anda dapat melakukan fungsi apa pun dari proses Anda di GDB. Saya menduga Anda memerlukan simbol debug dalam proses Anda ..)
  4. Buka file baru yang memanggil fungsi create () atau open (). (Lihat di komentar di bagian akhir, Anda akan melihat orang menyarankan untuk menggunakan dup2 () untuk memastikan pegangan yang sama akan digunakan)
  5. Lepaskan proses dan biarkan berjalan.

Omong-omong, jika Anda menjalankan OS linux pada kotak i386, komentar berbicara tentang alat yang lebih baik untuk mengarahkan keluaran ke konsol baru: 'retty' . Jika demikian, pertimbangkan penggunaannya.

yves Baumes
sumber
6

Bagi saya, ini berhasil:

  1. Masuk sebagai pemilik proses (bahkan rootditolak izinnya)

    ~$ su - process_owner
    
  2. Ekor deskriptor file seperti yang disebutkan di banyak jawaban lainnya.

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

Saya ingin menonton dari jarak jauh proses peningkatan versi yum yang telah dijalankan secara lokal, jadi meskipun mungkin ada cara yang lebih efisien untuk melakukan ini, inilah yang saya lakukan:

watch cat /dev/vcsa1

Tentunya Anda ingin menggunakan vcsa2, vcsa3, dll., Tergantung terminal mana yang digunakan.

Selama jendela terminal saya memiliki lebar yang sama dengan terminal tempat perintah dijalankan, saya dapat melihat snapshot dari output mereka setiap dua detik. Perintah lain yang direkomendasikan di tempat lain tidak berfungsi dengan baik untuk situasi saya, tetapi perintah itu berhasil.

RedScourge
sumber