linux で追記され続けているログ的ファイルの truncate を行う方法は?


今、サーバー(ないし何かしらのプロセス)が延々とログを `/path/to/log`
に出力(append)しているとします。今、多少ログが崩れても良いからこのファイルを切り詰めたいと思いました。

# 質問

このようなとき、ファイルを切り詰める正しい方法は何ですか？  
切り詰めた後は、その `/path/to/log`
に対しての出力を引き続き行なって欲しいと考えているのですが、これはその出力を行なっているプロセスが、例えば素朴にファイルディスクリプタを開いてそれに対して延々
write
しているだけのようなプログラムであったとしても、問題なく行えますか？それともログ出力中のプロセスは、何かの例外からの復帰処理に対応している必要がありますか？




ログファイルへ書き込むプロセスがログファイルを `open`(2) の `O_APPEND` でオープンして追記している、という前提でいいですか?
そうであれば、何らかの方法で該当ファイルのサイズを 0 にすれば大丈夫です。

既存ファイルのサイズを 0 にする方法は `open`(2) で `O_TRUNC` オプションを指定して書き込みオープンする、書き込みオープン後に
`ftruncate`(2) でサイズ 0 に変更する (もしくは `truncate`(2) でログファイル名を指定してサイズ 0 に変更する)
方法があります。

ほかの回答にある `cp /dev/null ログファイル名` や `>ログファイル名` は前者の `O_TRUNC`
で書き込みオープンして何も書き込まずクローズしている動作になります。

なお、ログを書き込むプロセスが `O_APPEND` でオープンしていない場合はログファイルのサイズを切り詰めることはできません。




ログファイルへ書き込むプロセスがログファイルを `open`(2) の `O_APPEND` でオープンして追記している、という前提でいいですか?
そうであれば、何らかの方法で該当ファイルのサイズを 0 にすれば大丈夫です。

既存ファイルのサイズを 0 にする方法は `open`(2) で `O_TRUNC` オプションを指定して書き込みオープンする、書き込みオープン後に
`ftruncate`(2) でサイズ 0 に変更する (もしくは `truncate`(2) でログファイル名を指定してサイズ 0 に変更する)
方法があります。

ほかの回答にある `cp /dev/null ログファイル名` や `>ログファイル名` は前者の `O_TRUNC`
で書き込みオープンして何も書き込まずクローズしている動作になります。

なお、ログを書き込むプロセスが `O_APPEND` でオープンしていない場合はログファイルのサイズを切り詰めることはできません。

