Lihat pengalihan STDOUT dari proses yang berjalan


17

Jika saya memulai aplikasi dengan perintah ini:

/path/to/my/command >> /var/log/command.log

Dan perintah tidak kembali, apakah ada cara, dari prompt lain, untuk melihat apa yang diatur untuk mengarahkan ulang STDOUT?

Saya mencari sesuatu seperti

cat /proc/PID/redirects

atau

ps -??? | grep PID

tetapi metode apa pun akan dilakukan.

Jawaban:


22

Lihat deskriptor file # 1 (STDOUT) di /proc/$PID/fd/. Kernel merepresentasikan file ini sebagai tautan simbolis ke file yang deskriptor dialihkan ke.

$ readlink -f /proc/20361/fd/1
/tmp/file

Sempurna! Terima kasih! Bisakah Anda memberikan tautan atau perincian tentang pengalihan lainnya seperti STDERR, yaitu nomor mana mereka?
— Kaya

Setidaknya di Linux (dan saya percaya pada setiap OS lain yang mirip UNIX) adalah 0: stdin, 1: stdout, 2: stderr (standard error). Perhatikan ada juga makro C yang didefinisikan dalam <stdio.h>: STD {IN, OUT, ERR} _FILENO. Lihat 'man stdout' untuk detailnya.
— Petr Uzel

0, 1, 2 untuk stdin, stdout dan stderr masing-masing dijamin di semua sistem mirip Unix / Unix, dan juga berlaku pada Windows.
— Paul Stelian

pada MacOS cara apa pun untuk melakukan ini? / proc / <pid> / fd / 1 tidak ada, mungkin saya bisa menggunakan mkfifo?
— Alexander Mills

4

Alat yang berguna untuk melihat file apa yang dibuka oleh proses apa lsof. Anda dapat mengarahkannya pada proses tertentu dengan lsof -p1234, dan Anda akan melihat sebagian besar informasi yang sama dengan yang Anda dapatkan ls -l /proc/1234/fddi Linux, yaitu file apa yang dibuka.

Hal yang paling berguna lsofadalah sebaliknya: lsof /path/to/filememberi tahu Anda proses apa yang menggunakan file itu.


1

Banyak jawaban menyebutkan melakukannya dengan cara ini:

tail -f /proc/{PID}/fd/1

Namun, saya menemukan bahwa itu tidak selalu berhasil. Atau, catterkadang menghasilkan hasil.

cat /proc/{PID}/fd/1

di mana {PID} dapat dicari menggunakan ps auxperintah.

Juga bagus untuk disebutkan, adalah bahwa nomor di akhir perintah (dalam hal ini fd / 1) dapat diubah untuk output lainnya.

 /proc/{PID}/fd/0 # STDIN
 /proc/{PID}/fd/1 # STDOUT
 /proc/{PID}/fd/2 # STDERR
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.