Bagaimana cara mengubah redirection output dari proses yang sedang berjalan?


11

Saya tahu cara mengarahkan output dan cara menekannya di bash. Sekarang, misalkan saya tidak sengaja lupa untuk menambahkan bagian pengalihan output ke perintah (misalnya 2>&1atau > /tmp/mystdout) dan proses latar belakang saya sudah berjalan untuk sementara waktu, dapatkah saya masih berubah ke mana stdoutdan stderrsedang ditulis? Saya benar-benar ingin tidak mematikan dan me-restart aplikasi.

Untuk lebih spesifik seperti yang diminta oleh Gilles dalam komentarnya, saya ingin mengutak-atiknya dalam skenario ini secara khusus:

  • file output salah
  • lupa dialihkan stderrkestdout

atau kombinasi keduanya

Misalnya saya menjalankan Apache dan saya dapat melihat deskriptor file:

/proc/8019/fd/0 -> /dev/null
/proc/8019/fd/1 -> /dev/null
/proc/8019/fd/2 -> /var/log/apache2/error.log

Ubah ke terminal lain? Atau ke file? Jika Anda puas melampirkan ke terminal saat ini atau sesi layar baru, lihat Bagaimana saya bisa menolak proses yang sedang berjalan dan menghubungkannya dengan shell layar baru?
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:


8

Anda dapat melakukannya menggunakan reredirect ( https://github.com/jerome-pouiller/reredirect/ ).

reredirect -m /dev/null <PID>

Anda dapat mengembalikan output awal proses Anda nanti menggunakan sesuatu seperti:

reredirect -N -O <M> -E <N> <PID>

( <M>dan <N>disediakan oleh peluncuran reredirect sebelumnya).

reredirect READMEjuga menjelaskan cara mengarahkan ulang ke perintah lain atau hanya mengarahkan stdout atau stderr.


3

Itu tidak mungkin. Atau setidaknya tidak mudah. Anda mungkin beruntung memasukkan gdb ke proses dan mengotak-atiknya di gdb, tetapi itu bisa menyebabkan crash semudah kesuksesan.



Jangan ragu untuk membagikannya, saya akan menjawabnya dengan suara :)
Dennis Kaarsemaker


1
Tidak terlalu. Semua alat yang terhubung dalam bug lain adalah tentang melampirkan ke terminal / sesi layar lain. Bukan tentang mengalihkan ke file lain. Meskipun mungkin tidak sulit untuk menambal reptyr untuk mengarahkan ulang ke file saja.
Dennis Kaarsemaker

Saya telah melihat sedikit ke sumber reptyr dan saya paling setuju dengan bagian "tidak mudah" dari jawabannya. Mungkin menyelam lebih dalam ke dalamnya beberapa waktu kemudian.
gertvdijk

2

Anda harus menggunakan reptyr untuk melampirkan proses lain ke terminal baru Anda saat ini. Misalnya: instal dan gunakan screenutilitas GNU , dan di dalamnya luncurkan reptyrperintah untuk "mengambil" pengalihan proses lainnya (dan mengendalikan terminal) dan melampirkannya ke terminal saat ini yang baru ( screenproses, jika Anda meluncurkan reptyrdari screen). Keuntungan melakukan ini dari suatu screensesi adalah bahwa, setelah berada di bawahnya screen, maka akan mudah untuk memutuskan dan menyambung kembali ke sana (misalnya, menutup sesi lokal Anda, pulang, dan membukanya kembali).


Terima kasih atas jawaban Anda, tetapi itu tidak membantu saya dengan kasus saya karena saya tidak bertanya tentang terminal detach / retach. Baca kembali pertanyaan saya dan contohnya secara khusus.
gertvdijk

ah, dalam hal itu: baca kode reptyr, cari tahu bagaimana memodifikasinya hanya untuk mengarahkan ulang stdout atau stderr. Kemudian jalankan dari shell lain yang mengalihkan aliran yang baru saja terpasang ke tempat yang Anda inginkan? (atau, lebih baik, menggunakan sumber reptyr, lakukan pengalihan langsung)
Olivier Dulac
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.