Lihat Mengalihkan Keluaran dari Proses yang Berjalan .
Pertama saya menjalankan perintah
cat > foo1
dalam satu sesi dan uji apakah data dari stdin disalin ke file. Kemudian di sesi lain saya mengarahkan ulang hasilnya.Pertama temukan PID dari proses:
$ ps aux | grep cat rjc 6760 0.0 0.0 1580 376 pts/5 S+ 15:31 0:00 cat
Sekarang periksa pegangan file yang telah dibuka:
$ ls -l /proc/6760/fd total 3 lrwx—— 1 rjc rjc 64 Feb 27 15:32 0 -> /dev/pts/5 l-wx—— 1 rjc rjc 64 Feb 27 15:32 1 -> /tmp/foo1 lrwx—— 1 rjc rjc 64 Feb 27 15:32 2 -> /dev/pts/5
Sekarang jalankan GDB:
$ gdb -p 6760 /bin/cat GNU gdb 6.4.90-debian [license stuff snipped] Attaching to program: /bin/cat, process 6760 [snip other stuff that's not interesting now] (gdb) p close(1) $1 = 0 (gdb) p creat("/tmp/foo3", 0600) $2 = 1 (gdb) q The program is running. Quit anyway (and detach it)? (y or n) y Detaching from program: /bin/cat, process 6760
p
perintah di GDB akan mencetak nilai ekspresi, ekspresi bisa berupa fungsi untuk dipanggil, bisa berupa panggilan sistem… Jadi saya menjalankanclose()
system call dan pass file handle 1, lalu saya jalankancreat()
panggilan sistem untuk membuka file baru. Hasilcreat()
adalah 1 yang berarti menggantikan pegangan file sebelumnya. Jika saya ingin menggunakan file yang sama untuk stdout dan stderr atau jika saya ingin mengganti pegangan file dengan nomor lain maka saya perlu memanggildup2()
panggilan sistem untuk mencapai hasil tersebut.Untuk contoh ini saya memilih menggunakan
creat()
bukannyaopen()
karena parameternya lebih sedikit. Makro C untuk flag tidak dapat digunakan dari GDB (tidak menggunakan header C) jadi saya harus membaca file header untuk menemukan ini – tidak terlalu sulit untuk melakukannya tetapi akan membutuhkan lebih banyak waktu. Perhatikan bahwa 0600 adalah izin oktal untuk pemilik yang memiliki akses baca/tulis dan grup serta orang lain yang tidak memiliki akses. Ini juga akan berfungsi untuk menggunakan 0 untuk parameter itu dan menjalankan chmod pada file nanti.Setelah itu saya memverifikasi hasilnya:
ls -l /proc/6760/fd/ total 3 lrwx—— 1 rjc rjc 64 2008-02-27 15:32 0 -> /dev/pts/5 l-wx—— 1 rjc rjc 64 2008-02-27 15:32 1 -> /tmp/foo3 <==== lrwx—— 1 rjc rjc 64 2008-02-27 15:32 2 -> /dev/pts/5
Mengetik lebih banyak data ke
cat
menghasilkan file/tmp/foo3
ditambahkan ke.Jika Anda ingin menutup sesi asli, Anda harus menutup semua pegangan file untuk itu, buka perangkat baru yang dapat menjadi pengontrol tty, lalu panggil
setsid()
.
Anda juga dapat melakukannya menggunakan reredirect
(https://github.com/jerome-pouiller/reredirect/).
Perintah di bawah mengalihkan keluaran (standar dan kesalahan) dari proses PID
ke FILE
:
reredirect -m FILE PID
README
dari reredirect
juga menjelaskan fitur menarik lainnya:cara memulihkan keadaan awal proses, cara mengalihkan ke perintah lain, atau hanya mengalihkan stdout atau stderr.
Alat ini juga menyediakan relink
, sebuah skrip yang memungkinkan untuk mengalihkan keluaran ke terminal saat ini:
relink PID
relink PID | grep usefull_content
(reredirect
tampaknya memiliki fitur yang sama dari Dupx dijelaskan dalam jawaban lain tetapi, itu tidak tergantung pada Gdb).