GNU/Linux >> Belajar Linux >  >> Linux

Cara mengarahkan output dari proses yang sudah berjalan

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 menjalankan close() system call dan pass file handle 1, lalu saya jalankan creat() panggilan sistem untuk membuka file baru. Hasil creat() 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 memanggil dup2() panggilan sistem untuk mencapai hasil tersebut.

Untuk contoh ini saya memilih menggunakan creat() bukannya open() 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).


Linux
  1. Bagaimana Mengubah Pengalihan Output Dari Proses yang Berjalan?

  2. Bagaimana Cara Melihat Output Dari Proses yang Berjalan Di Sesi Bash Lain?

  3. Cegah Proses Yang Sudah Berjalan Untuk Menulis Ke File Yang Ada?

  1. Bagaimana cara mengarahkan output dari system() ke file?

  2. Bagaimana cara mengarahkan output dari perintah waktu ke file di Linux?

  3. Cara mengarahkan seluruh output dari spark-submit ke file

  1. Cara Menyimpan Output Perintah ke File di Linux

  2. Cara mengarahkan output program sebagai inputnya

  3. Bagaimana Saya Dapat Membuat File Dump dari Proses yang Berjalan di Linux?