Saya mencari sesuatu yang saya curigai tidak ada: Pipa bernama buffered (fifo) non-blocking untuk digunakan dari baris perintah. Apakah ada hal seperti itu?
Inilah kasus penggunaannya: Misalkan saya memiliki proses yang akan berjalan lama di latar belakang dan memuntahkan banyak output stdout
. Saya tidak terlalu peduli dengan output dan tidak ingin menyimpannya (mungkin saya tidak punya cukup ruang), tetapi saya ingin "mampir" secara berkala dan mengikuti apa yang dilakukannya, lalu keluar lagi dan biarkan untuk melakukan tugasnya. Jadi saya ingin mengarahkan outputnya ke pipa bernama buffered, non-blocking dan kemudian secara berkala menyadapnya.
Jadi pada dasarnya saya ingin memulai seperti ini ( 10M
menjadi ukuran buffer):
mkmagicfifo magicfifo 10M
spewingprocess > magicfifo &
... dan secara berkala mampir untuk melihat apa yang terjadi ...
tail -f magicfifo
... tanpa magicfifo
menyimpan semua output (jadi, bukan file normal), dan tanpa itu memblokir proses memuntahkan ketika mengisi dan tidak mengetuk (jadi, tidak cukup pipa bernama normal).
Saya tidak berpikir solusi yang melibatkan tail
atau prune
akan melakukannya (well, saya bisa memikirkan solusi yang melibatkan tail
), karena tail
masih akan mengharuskan saya menyimpan semua data di suatu tempat (jika saya ingin mampir dan keluar dari melihat itu), dan prune
harus menulis ulang file, mungkin (saya akui saya belum mencoba / membuktikan ini) melanggar pengalihan proses menghasilkan semua output.
Saya berharap saya dapat menulis beberapa utilitas untuk melakukan ini, tetapi * nix memiliki begitu banyak aspek keren dari file dan pipa dan semacamnya, saya hanya bisa berpikir ini ada dan saya tidak tahu tentang itu.
Jadi: Apakah ada hal seperti itu, dan jika demikian apa itu?
sumber
Jawaban:
Saya pikir yang Anda cari adalah GNU
screen
. Ini mempertahankan buffer untuk menahan layar terakhir penuh atau dua output dari satu atau lebih program dan memungkinkan Anda memutuskan sambungan dan kembali lagi nanti.sumber
tmux
dandtach
- apa pun di kelas yang sama dari aplikasi terminal multiplexer / sesi manajer harus dapat mencapai hal yang sama.Anda dapat menggunakannya
pv
, ia menyediakan buffering sebanyak yang Anda inginkan dalam sebuah pipa. Anda bisa menggunakannya seperti ini:Itu akan memberi Anda hingga 1GB buffering antara
spewingprocess
dan fifo. Sebagian besar distribusi Linux menawarkanpv
paket yang disebut, percaya atau tidakpv
,.sumber
Saya memiliki masalah yang sama. Ini solusi pertama saya. Pertama-tama tulis output ke file yang kita potong setelah setiap baris sehingga tidak tumbuh tanpa batas:
Kemudian baca dari file menggunakan tail (di mana
2> /dev/null
menghilangkan pesan kesalahan "file terpotong"):Dengan cara ini buffer tidak tumbuh dan kita dapat multiplex, mis. Jalankan sebanyak ekor yang kita inginkan. Namun, masalah dengan pendekatan ini adalah kita bisa kehilangan data saat kita memotong lebih cepat daripada yang bisa dibaca oleh ekor seperti yang ditunjukkan tes ini:
Setelah berjalan beberapa saat, baris pertama dan terakhir adalah:
Tetapi file memiliki lebih sedikit baris, sehingga beberapa hilang:
Tetap ini tampaknya solusi yang bagus jika Anda tidak terlalu peduli dengan kehilangan data atau ketika proses memuntahkan Anda tidak cukup cepat untuk kehilangan data terjadi.
sumber