なぜ/ dev / nullを何かの上に置くのですか?
iノードをそのままにしながら、ファイルの内容を切り捨てるためにそれを行います。そのファイルを読み取りまたは書き込み用に開いているすべてのプログラムは、ファイルサイズがゼロにリセットされるという事実以外では影響を受けません。
よくある偽の代替策は、ファイルを削除してから再度作成することです。
rm file
touch file
または同様のもの:
mv file file.old
gzip file.old
touch file
問題は、これらの方法では、削除時に削除されたファイルを開いているプロセスによって古いファイルが書き込まれ続けることを妨げないことです。理由は、Unixファイルシステムでは、ファイルを削除するとき、その名前(パス)をそのコンテンツ(inode)からリンク解除するだけです。iノードは、読み取りまたは書き込み用にオープンしているプロセスがある限り、生き続けます。
これはいくつかの悪影響をもたらします。削除されたファイルを開くための簡単で移植性のある方法がないため、ファイルの削除後に書き込まれたログは失われます。プロセスが削除されたファイルに書き込みを行っている限り、そのコンテンツはファイルシステム上のスペースを使用しています。つまり、ファイルがディスクをいっぱいにしていたためにファイルを削除または作成しても、ディスクはいっぱいのままです。この後者の問題を解決する1つの方法は、ロガープロセスを再起動することですが、重要なサービスに対してはこれを行いたくない場合があり、中間ログは完全に失われます。また、作成するファイルには元のファイルと同じ権限、所有者、およびグループがない可能性があるため、副作用もあります。これにより、たとえば、ログアナライザーが新しく作成されたファイルを読み取ることができなかったり、さらに悪いことに、ロギングプロセスが独自のログを書き込むことができなくなったりする可能性があります。
最初の方法cat /dev/null > file
は目標を適切に達成しますが、粘り強い都市伝説にもかかわらず、そのcat /dev/null
部分は何の役にも立ちません。設計上空の擬似ファイルを開き、そこから何も読み取れず、最終的に終了します。このコマンドを使用すると、キーストローク、バイト、システムコール、およびCPUサイクルが無駄になり、機能を変更することなく、間違いなく高速なno-opコマンド、:
またはほとんどのシェルでコマンドをまったく使用せずに置き換えることができます。
メタファーを試して、役に立たないことを説明しましょうcat /dev/null
。あなたの目標はグラスを空にすることだとしましょう。
リンクされたドキュメントを最後まで読んだ場合、スクリプトの拡張バージョンからのこの行のコメントに気付くかもしれません。
cat / dev / null> wtmp# ':> wtmp'と '> wtmp'は同じ効果があります。
彼らは確かに持っています。あまりにも悪いcat /dev/null
コードで保持されていました。
これは、次のコードがすべての一般的なシェル(csh
およびsh
ファミリー)で機能することを意味します。
cd /var/log
: > messages
: > wtmp
echo "Log files cleaned up."
これは次のように、ボーンの構文を使用して、すべてのシェルで動作しますash
、bash
、ksh
、zsh
同類と:
cd /var/log
> messages
> wtmp
echo "Log files cleaned up."
ただし、POSIX Bourne以前の古代のシェルでは、これらのコマンドのいずれも、cat /dev/null
実行中のシェルスクリプトによって追加されたファイルが後で書き込まれた場合、ファイルを切り捨てません。ゼロバイトファイルの代わりに、サイズが変更されていないスパースファイルになります。同じことが、書き込み前の現在の位置と考えられる位置をシークするプロセスによってファイルが書き込まれた場合に発生します。
また、ファイルを切り捨てるようにしばしば提案されるいくつかの代替ソリューションには欠陥があることに注意してください。
次の両方は、単に仕事をしません。結果のファイルは空ではありませんが、空の行が含まれています。これによりwtmp
、固定幅レコードを保存するようなログファイルが破損します。
echo > file
echo "" > file
BSD sh
オプションに基づく次のオプションは移植性がありません。POSIXではエコーの許可オプションが指定されていないため、 " -n
"の行を含むファイルが作成される可能性があります。
echo -n > file
System V sh
エスケープシーケンスを使用しても移植性がない。一部のシェルでは、「\c
」を含む行を含むファイルが作成されます。
echo "\c" > file
そのジョブを実行するために設計されたコマンドを使用します。truncate
このコマンドは、POSIXで指定されていないため、Unix / Linuxシステムから欠落している可能性があるため、使用中の移植性はありません。
truncate -s 0
最後に、移植性があり、適切に仕事をするいくつかの選択肢があります: