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


32

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

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

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


あなただけではできませんchmod -w log.txtか?
user168715 16

回答:


30
# cp -a /dev/null log.txt

これにより、適切なメジャーおよびマイナーdev番号を持つnullデバイスがコピーされるlog.txtため、別のデバイスができますnull

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


4
このコマンドに必要なsudo(またはrootユーザーとして実行する)ことに注意してください 。「正しいメジャーおよびマイナー開発番号」とはどういう意味か(答えで)説明してください。
mklement0 16

3
(私はOPではありません。)アップデートに感謝/dev/nullしますが、コマンドで使用されているように、「メジャー番号とマイナー番号」がファイルパスにどのように関連するかについて、まだ混乱しています。そして、私はそれをノートに将来のリーダーを助けるだろうと思うあなたの答えにsudo必要とされます。
mklement0 16

1
@wallyk:ありがとう、それは確かに知っておくに良いことです。しかし、私のポイントは次のとおりcp -a /dev/null log.txtです。私のコメントに関してどのように影響を与えますか?
mklement0 16

1
@MALON:確かにあなたがした、とUbuntu 14.04であなたが行う必要性sudoあなたがユーザーとして実行することが起こる場合を除き、このコマンドを実行するにはroot(一般的に推奨されて)。使用するsudo(またはとして実行されているrootファイルがその場所に配置する必要がある場合はハードリンク(この回答)または(V.Michelの答え@)シンボリックリンクを作成する)は、すべての後に右の溶液であってもよい任意のユーザーアカウントがに書き込むことができ、しかし、ポイントは次のとおりです。明示的にその要件に注意してください。
mklement0 16

1
PS:メジャー、マイナーのコメントは、おそらくの使用を推奨する質問に対するコメントに関連していることを知っていますmknod。コメントは一般的にあまり注目されないので、質問を読んでいるだけであなたの答えが混乱する可能性があることに注意してください(私もそうです;また、ほとんどの人は決してメジャーデバイス番号やマイナーデバイス番号などの概念にさらされないことに注意してください)。
mklement0 16

65

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

ln -s /dev/null log.txt

これには自己文書化の利点もありls -l log.txtます。たとえば、「1、3」が何らかの意味で重要であることを知ることに依存するのではなく、/ dev / nullへのシンボリックリンクであることを示します。
モンティハーダー

14

ここでの他の答えはおそらく機能します。特に、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

ただし、バインドマウントがあるシステムでのみ機能します。(最新のLinuxなど)
reinierpost

とにかく、ログファイルは読み取り専用のファイルシステムには属しません。
モンティハーダー

1
読み取り専用ファイルシステム上の単一のファイルに書き込みたいと思う頻度に驚くでしょう。そして、それはnodevファイルシステム上に非常によくあるかもしれません。
ラースク16

6

アプリケーションがlog.txtをどのように処理するかに大きく依存します。

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

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

log.txtと呼ばれるファイルを作成しようとする試みをすべて捨てながら、ほとんどの操作をすぐに通過させるカスタムオーバーレイファイルシステムを作成したいのであれば、と思います。


chattr +i log.txt初めて、アプリケーションはファイルをもう削除しません。
マルコマルサラ

3

さて、名前付きパイプを使用した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

filterやsend over ncなど、ダンプされたログでほとんど何でもできます。


場合はcat、プロセスが強制終了またはクラッシュされ、パイプがいっぱいになると、ログインプログラムがハングします。
マルコマルサラ

-1

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


これは、他の人がすでに言ったことに何も追加しません。
クサラナナンダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.