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
gertvdijk
sumber
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.

Jérôme Pouiller
sumber
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.

Dennis Kaarsemaker
sumber
1
Ada alat untuk ini saat ini .
Gilles 'SO- stop being evil'
Jangan ragu untuk membagikannya, saya akan menjawabnya dengan suara :)
Dennis Kaarsemaker
Um, saya sudah melakukannya .
Gilles 'SO- berhenti menjadi jahat'
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).

Olivier Dulac
sumber
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