web-dev-qa-db-ja.com

/ dev / nullへのハードリンクでファイルを置き換えます

Log.txtに書き込むアプリケーションを実行しています。アプリが新しいバージョンに更新され、サポートされているプラ​​グインの互換性がなくなりました。これは、大量のエラーをlog.txtに強制し、別のログファイルへの書き込みをサポートしていないようです。

それらを別のログに書き込むにはどうすればよいですか?

私は、log.txtをハードリンク(アプリケーションは違いを正しく認識できないのか?)または/ dev/nullを指すハードリンクに置き換えることを検討しました。私のオプションは何ですか?

33
MALON
# cp -a /dev/null log.txt

これにより、正しいメジャーおよびマイナーの開発番号が付いたnullデバイスがlog.txtにコピーされるため、別のnullを取得できます。

カーネルでは、デバイスは名前ではまったく認識されず、メジャー番号とマイナー番号で認識されます。使用しているOSがわからないので、すでにわかっているところから番号をコピーするだけで便利です。メジャー番号とマイナー番号を間違えて作成すると、おそらく他のデバイス、おそらくディスクなど、書き込みたくないデバイスを作成したことになります。

30
Joshua

/ dev/nullへのシンボリックリンクを作成でき、rootである必要はありません。

ln -s /dev/null log.txt
65
V. Michel

ここでの他の答えはおそらく機能します。特に、symlinkソリューションがおそらく最も簡単なソリューションになるでしょう。これは主に完全を期して提供します。

mknod(またはcp -a)を含むソリューションは、ファイルを含むファイルシステムがデバイスをサポートしていない場合(たとえば、nodevオプションでマウントされた場合)に問題になります。そしてもちろん、ファイルシステム間のハードリンクは機能しません。

ハードリンクまたは新しいデバイスノードを作成する代わりに、バインドマウントを使用します。これにより、ファイルまたはディレクトリをファイルシステムツリーの一部から別の場所にマウントできます。したがって、たとえば、次のコマンドを実行できます。

mount -o bind /dev/null /path/to/log.txt

これはハードリンクのように機能しますが、次のようになります。

  • ファイルシステム全体で動作可能(ハードリンクのようなファイルシステムのiノードに基づいていないため)
  • 読み取り専用のファイルシステムで動作します(実際にファイルシステムを変更していないため)

完全な例:

bash-4.3# ls -l /var/log/boot.log
-rw-r--r--. 1 root root 7436 Dec 19 10:00 /var/log/boot.log
bash-4.3# mount -o bind /dev/null /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log
bash-4.3# echo words words words > /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log
14
larsks

これは、アプリケーションがlog.txtを処理する方法に大きく依存します。

アプリケーションが既存のファイルを開いて書き込むだけの場合、他の回答で説明されているように、/ dev/nullにシンボリックリンクし、別の場所にシンボリックリンクし、別の場所にハードリンクすることができます(ただし、ハードリンクはクロスファイルシステムにすることはできないため、これの多くのポイント)/ dev/nullデバイスノードのコピーをそこに作成するなど。

アプリケーションがlog.txtを削除して再作成した場合、OTOHは機能しません。ディレクトリ全体をどこか別の場所にシンボリックリンクして、書き込みを別のファイルシステムにリダイレクトすることもできますが、それはそれに関することであり、ディレクトリ内の他のものに対処する必要があります。

Log.txtというファイルを作成しようとする試みをすべて破棄しつつ、ほとんどの操作をそのまま通過させるカスタムオーバーレイファイルシステムを作成したいと本当に思っているなら、.

6
plugwash

さて、名前付きパイプを使用した1つの不愉快な方法:

# create a named pipe
mkfifo /path/to/log.txt
# read contents from the pipe and redirect them to /dev/null
cat /path/to/log.txt > /dev/null

フィルターや送信ncなど、ダンプされたログを使用してほとんど何でもできます。

3
user3824053

ファイルを実際のnullデバイスにすることを検討してください。 mknodで作成された「log.txt」ファイルは、正しいファイルタイプと同じマイナー番号およびメジャー番号で、nullデバイスとして機能します。

1
rackandboneman