私は私の質問に対する答えを見つけるのに運があまりありませんでしたが、たぶん私はそれを正しく尋ねていないかもしれません。
次のような起動プロセスがあります。
nohup ping 127.0.0.1 > log.txt >2>&1 &
すべての標準出力をlog.txtに送信する非常に簡単なコマンドです。唯一の問題は、私が実行しているコマンドがn秒ごとにlog.txtにデータを送信することです。 log.txtファイルを追加してドライブをいっぱいにする危険があるのではなく、log.txtファイルに1行を出力したいと思います。
log.txtに1行だけ出力して上書きし続ける方法はありますか?
答え1
以下は、ログファイルの最後の出力行だけを保持する迅速で汚い解決策です。
ping localhost |
while IFS= read -r line; do
printf '%s\n' "$line" > log.txt;
done
これで、読み取るためにファイルにアクセスしようとすると、さまざまな競合状態が発生する可能性があります。相互アクセスを防ぐためにファイルを「ロック」することが役に立つかもしれません。 stackoverflowでこの質問をロックする方法についての詳細な情報は良い開始かもしれません。複数のスクリプトでbash内のファイルへのアクセスを同期(ロック/ロック解除)する方法は?
答え2
このスクリプトを試してください。私にとって効果的でした。
% nohup ping 127.0.0.1 > log.txt >&1&
次のように入力して、プロセスが実行中であることを確認します。
% ps ax | grep ping
プロセスが実行されている場合:
% tail -f log.txt
pingが続く場合、スクリプトは正常に動作します。