Bagaimana cara mengetahui proses apa yang sedang ditulis ke STDOUT?


19

Saya memiliki dua contoh proses yang sedang berjalan. Salah satunya adalah "BEGITU OUT!" dan mencetak kesalahan tanpa henti ke STDOUT.

Saya ingin membunuh proses yang rusak tetapi saya harus memastikan saya tidak mengakhiri yang salah. Keduanya dimulai pada saat yang sama dan menggunakan topsaya bisa melihat mereka berdua menggunakan jumlah memori dan CPU yang sama. Saya tidak bisa menemukan apa pun yang menunjukkan proses mana yang berperilaku buruk.

Hal teraman adalah mencari tahu proses / pid mana yang menulis ke STDOUT.

Apakah ada cara untuk melakukan itu?


1
Menulis ke stdout berarti menulis ke deskriptor file 1 ((dari proses yang dimaksud) yang bisa berupa terminal atau /dev/null). Apakah Anda yakin maksud Anda bukan file tertentu (seperti perangkat terminal, atau file log ...)?
Stéphane Chazelas

Jika keduanya dimulai dalam shell yang sama maka mereka berdua menulis ke STDOUT, jadi menyematkan ini tidak akan membantu Anda mengidentifikasi yang mana dari 2 yang akan dibunuh. Metode Jofel kemungkinan adalah apa yang Anda cari.
slm

Apa yang sebenarnya ia maksudkan adalah yang mana yang menghasilkan output pada terminal .
Barmar

Jawaban:


17

Di Linux, dengan asumsi Anda ingin tahu apa yang menulis ke sumber yang sama dengan stdout shell Anda terhubung, Anda bisa melakukannya:

strace -fe write $(lsof -t "/proc/$$/fd/1" | sed 's/^/-p/')

Itu akan melaporkan write()panggilan sistem (pada deskriptor file apa saja) dari setiap proses yang memiliki setidaknya satu deskriptor file terbuka pada file yang sama dengan fd 1 dari shell Anda.


Itulah yang ada dalam pikiran saya pada awalnya, saya akan mencoba kedua metode berkat Anda berdua.
TCZ8

23

Anda dapat menghentikan kedua pemrosesan dengan mengirimkannya SIGSTOP (ganti pid1 dan pid2 dengan PID yang sebenarnya atau gunakan killalldan nama aplikasi):

kill -SIGSTOP pid1 pid2

Pencetakan pada terminal (atau ke mana pun stdout diarahkan) harus berhenti. Kemudian lanjutkan salah satu dari mereka menggunakan

kill -SIGCONT pid1

Jika pesan kesalahan muncul segera, Anda tahu itu proses pertama. Jika tidak, Anda dapat menghentikannya lagi dan melanjutkan yang kedua ...

Sebelum membunuh proses yang terhenti, adalah praktik yang baik untuk mengirim SIGCONT terlebih dahulu.

Teknik yang sama dapat digunakan dengan Ctrl-Zdan kontrol shell pekerjaan ( fg %1, bg %1, kill %1, ...).


1
Itu cara yang sangat baik untuk memecahkan masalah itu tetapi saya benar-benar mencari cara untuk melacak siapa yang sedang menulis ke terminal. Terima kasih
TCZ8

Baru saja membaca ulang pertanyaan ini, sepertinya saya punya otak kentut saat menulis komentar terakhir saya. Ini juga akan memperbaiki masalah saya. Terima kasih.
TCZ8
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.