Linuxには、ディスクに非常に遅く(時には1kb / sより遅い場合もあります)書き込みプロセス(ffmpeg)があります。 FFmpegは頻繁に作成されていない256kbチャンクまでバッファリングできますが、ffmpegは時々中断され、ファイルが更新されていることを確認してこれらの中断を検出しようとすると、更新間に最大10〜15分待つ必要があります。それ以外の場合は、ffmpegプロセスが書き込みを停止したように見えますが、実際には内部バッファをいっぱいにしているときに誤ってffmpegプロセスを終了する可能性があります。
strace(とにかく見つけることができます)を使用しない限り、これを検出する方法がないようです。だからffmpegでバッファリングをオフにし、ffmpegでバッファリングされていないディスクに書き込む方法を知りたいです。
これにより、ディスクは常に小さな書き込み操作を実行し、電力を無駄にします(SSDを使用すると摩耗レベリングが混乱する可能性があります)。
そのため、ffmpegがリフレッシュ属性を指定できる「仮想ファイル」(メモリ - カーネルメモリまたはプロセス)に書き込もうとしています。 2分ごとにリフレッシュを指定すると、ファイルサイズを記録し続けていることを確認できます。
私はこれを行う他の方法を見逃しているとは思わない。 ffpmegに入ってくるソケットストリームを観察できますが、プロセス自体はまだ書き込みを中止してデータを失う可能性があります。 ffmpegの外部でバッファリングするのが最善の方法のようです。
Linuxにはこれを行う組み込みの方法がありますか、それともこれがカスタムプロセスを意味しますか?私は小さなCプログラムでこれを行い、データをパイプする方法を知っていると思いますが、よりきれいな方法があるかどうか疑問に思います。
答え1
これを達成するためにGNUを使用できますdd
。 GNUは、テープドライブの読み書き時にデータを最適に再ブロックするように設計されています。たとえば、バッファされていない出力を次にパイプします。
dd obs=20k status=progress >/the/file
20k
ディスクに書き込むたびに使用したい出力ブロックサイズはどこにありますか?k
キロバイトを表します。 stderrから1行を取得すると、status=progress
書き込みが完了すると更新されます。
20480 bytes (20 kB, 20 KiB) copied, 12 s, 1.7 kB/s
必要に応じてこのオプションを無視してdd
進行状況を記録したい場合は、SIGUSR1信号で終了できます。