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.

Kaya
sumber

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
Petr Uzel
sumber
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.

Gilles 'SO- berhenti menjadi jahat'
sumber
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
Serguei Fedorov
sumber