Saya telah menjalankan skrip selama beberapa hari sekarang. Saya mengalihkan stdout ke $HOME/mylog
, tetapi tidak mengarahkan stderr karena saya pikir tidak akan ada apa-apa di dalamnya. Tiba-tiba ribuan garis mulai keluar di stderr, jadi saya menunda pekerjaan itu. Apakah ada cara saya dapat mengarahkan stderr ke $HOME/myerr
sekarang, tanpa perlu me-restart skrip?
Saya memiliki akses sudo di kotak dan itu OS X.
Mungkin sesuatu yang menggunakan perangkap dtools?
Saya tidak bisa kehilangan pekerjaan yang telah dilakukan skrip sejauh ini dan memulai kembali dari awal. Apakah ada cara untuk "membuang objek dalam memori" pada disk, membekukan program, mengedit variabel (mis. Deskriptor file) dan melanjutkan dengan konteks baru?
bash
io-redirection
stdout
Robottinosino
sumber
sumber
Jawaban:
Saya pikir itu mungkin jika Anda melampirkan proses penerjemah terkait ke gdb. Saya mencobanya dengan perl one-liner ini
dan itu berhasil tetapi sayangnya tidak dengan skrip bash yang serupa.
Pertama-tama Anda harus mencari tahu PID dari proses yang outputnya ingin Anda tangkap. Kemudian mulailah dari
gdb
terminal lain dan jalankan perintah-perintah gdb berikutsetelah itu seluruh data yang dituliskan
stderr
dialihkan ke/abs/olu/te/path/filename
, sejakattach PID
melampirkan proses ke gdb dan menghentikannyacall close(2)
menutup prosesstderr
pengesahan (karenastdout
pengarsipan adalah 1)call open(...)
membuka file baru dan mengambil bilangan bulat yang tidak terpakai terendah untuk file yang baru dibuat dandetach PID
melanjutkan prosesnyaSetidaknya di mesin saya. Dua baris pertama kompatibel dengan POSIX tetapi bukan yang ketiga.
Argumen kedua dan ketiga
open
di baris ketiga didokumentasikanman 2 open
. Dalam kasus saya 65 berartiopen
harus membuat file dan membuka file hanya-menulis yaituO_WRONLY | O_CREAT
(didefinisikan dalamfcntl.h
). Argumen ketiga memberitahu terbuka untuk membuat file dengan izin baca dan tulis untuk pengguna yaituS_IWUSR | S_IRUSR
(didefinisikan dalamsys/stat.h
). Jadi mungkin Anda harus mencari sendiri nilai yang sesuai pada mesin Anda.sumber
Ini adalah jawaban yang kasar dan saya harap orang lain melakukan yang lebih baik, tetapi jika tidak ada ide lain yang muncul, pasang gdb dan paksa proses untuk melakukan beberapa syscall:
sumber
open()
ambil FD 1? Atau Anda hanya perlu menelepondup()
beberapa kali?p open("errfile", O_WRONLY)
benar - benar bekerja pada mesin Anda?p dup2(xxx, 2)
dan kemudian dip close(xxx)
manaxxx
nilai pengembalianopen
. Ini adalah hal yang rumit, lebih baik tidak menggunakan perintah ini pada proses yang berjalan lama sampai Anda yakin tidak ada pilihan lain./dev/null
sayaerrfile
jadi saya tidak perluO_CREAT
. DanO_WRONLY
menjadi makro, apakah itu meluas atau tidak tergantung pada apakah gdb menghentikan proses pada baris di mana simbol debug tersedia dan makro didefinisikan. Menyuntikkan kode ke dalam proses dengan gdb berbahaya dan tidak ada orang yang seharusnya menyalin perintah ini tanpa memahaminya.