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>&1
atau > /tmp/mystdout
) dan proses latar belakang saya sudah berjalan untuk sementara waktu, dapatkah saya masih berubah ke mana stdout
dan stderr
sedang 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
stderr
kestdout
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
linux
bash
io-redirection
gertvdijk
sumber
sumber
Jawaban:
Anda dapat melakukannya menggunakan reredirect ( https://github.com/jerome-pouiller/reredirect/ ).
Anda dapat mengembalikan output awal proses Anda nanti menggunakan sesuatu seperti:
(
<M>
dan<N>
disediakan oleh peluncuran reredirect sebelumnya).reredirect
README
juga menjelaskan cara mengarahkan ulang ke perintah lain atau hanya mengarahkan stdout atau stderr.sumber
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.
sumber
Anda harus menggunakan reptyr untuk melampirkan proses lain ke terminal baru Anda saat ini. Misalnya: instal dan gunakan
screen
utilitas GNU , dan di dalamnya luncurkanreptyr
perintah untuk "mengambil" pengalihan proses lainnya (dan mengendalikan terminal) dan melampirkannya ke terminal saat ini yang baru (screen
proses, jika Anda meluncurkanreptyr
dariscreen
). Keuntungan melakukan ini dari suatuscreen
sesi adalah bahwa, setelah berada di bawahnyascreen
, maka akan mudah untuk memutuskan dan menyambung kembali ke sana (misalnya, menutup sesi lokal Anda, pulang, dan membukanya kembali).sumber