web-dev-qa-db-ja.com

ファイルを作成しているプロセスを特定する方法は?

ファイルパスが与えられた場合、どのプロセスがそれを作成(および/または読み取り/書き込み)するかをどのように判断できますか?

67
Anton Barkovsky

lsofコマンド(すでにいくつかの回答で述べられています)は、実行時にどのプロセスがファイルを開いているかを通知します。 lsofは、ほとんどすべてのUNIXバリアントで使用できます。

lsof /path/to/file

lsofは、2マイクロ秒前に開かれ、1マイクロ秒前に閉じられたファイルについては通知しません。特定のファイルを監視し、アクセスしたときに反応する必要がある場合は、さまざまなツールが必要です。

少し前もって計画できる場合は、ファイルをLoggedFSファイルシステムに置くことができます。 LoggedFSは、階層内のファイルへのすべてのアクセスをログに記録する Fuse スタックファイルシステムです。ロギングパラメータは高度に設定可能です。ヒューズは すべての主要なunices で利用できます。ファイルが作成されたディレクトリへのアクセスをログに記録する必要があります。提供されているサンプル構成ファイルから始めて、 このガイド に従って微調整します。

loggedfs -l /path/to/log_file -c /path/to/config.xml /path/to/directory
tail -f /path/to/log_file

多くの労働組合が他の監視施設を提供している。 Linuxでは、比較的新しい 監査サブシステム を使用できます。それについての文献はあまりありません(しかし、loggedfsについてはそれ以上です)。 このチュートリアル または afewexamples または auditctl manページ 。ここでは、デーモンが起動していることを確認してから、auditctlを実行するだけで十分です。

auditctl -w /path/to/file

(古いシステムにはauditctl -a exit,always -w /path/to/file)でログを監視します/var/log/audit/audit.log

まあ、lsofを繰り返し実行することもできます。運が良ければ、犯人は表示するまでファイルを開いたままにしておきます。すなわち:

$ lsof -r1 /path/to/file

または多くのファイル

$ lsof -r1 /path/to/folder/*

これにより、特定の時点で、1秒に1回、指定されたパスへのすべてのアクセスがリストされます。これには、ファイルにアクセスするプロセスのPIDのリストが含まれます。

それがうまくいかない場合、つまり、ファイルが非常に速く開かれたり閉じられたりする場合(これはよくあることです)、より複雑なツールを探す必要があると思います。たぶん loggedfs 何かかもしれない?

ハックランド
毎秒1回のlsofが機能しない場合は、もちろん、lsofをできるだけ速く繰り返し実行するwhileループをハックすることができます。お気に入り:

$ while true; do lsof /paht/to/file; done;

きれいではありませんが、知っている人はそれを行うだけかもしれません。

11
0scar

lsofを使用できます:

$ lsof /tmp/file
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
less      4737 wena    4r   REG    8,6    90700 1643536 /tmp/file

lessという名前のプロセスは、ファイル "/ tmp/file"を開いたままにしていると言います。

[〜#〜] note [〜#〜]:不思議なことに、geanyまたはnanoを使用すると、動作しません。より良い提案を楽しみにしています。

1
tshepang

lsgrepを使用して、Chromeで使用されるファイルを見つけることができます

$ ls -l /proc/*/fd | grep "chrome"
lrwx------ 1 ba abc 64 Jul 16 22:19 104 -> /home/abc/.config/google-chrome/Default/Cookies
lr-x------ 1 abc abc 64 Jul 16 22:19 113 -> /opt/google/chrome/nacl_irt_x86_64.nexe
lrwx------ 1 abc abc 64 Jul 16 22:19 121 -> /home/abc/.cache/google-chrome/Default/Cache/data_0
lrwx------ 1 abc abc 64 Jul 16 22:19 122 -> /home/abc/.cache/google-chrome/Default/Cache/data_1
lrwx------ 1 abc abc 64 Jul 16 22:19 123 -> /home/abc/.cache/google-chrome/Default/Cache/data_2
lr-x------ 1 abc abc 64 Jul 16 22:19 125 -> /home/abc/.config/google-chrome/Dictionaries/en-US-3-0.bdic

もう1つの方法は、lsofおよびgrepを使用することです

$ lsof | grep "chrome"
chrome     2204       abc  cwd       DIR                8,5     4096 1441794 /home/abc
chrome     2204       abc  rtd       DIR                8,5     4096       2 /
chrome     2204       abc  txt       REG                8,5 87345336 5111885 /opt/google/chrome/chrome
chrome     2204       abc  mem       REG                8,5  4202496 1443927 /home/abc/.cache/google-chrome/Default/Media Cache/data_3
chrome     2204       abc  mem       REG                8,5  1056768 1443926 /home/abc/.cache/google-chrome/Default/Media Cache/data_2
chrome     2204       abc  mem       REG                8,5   270336 1443925 /home/abc/.cache/google-chrome/Default/Media Cache/data_1
chrome     2204       abc  mem       REG                8,5    45056 1443924 /home/abc/.cache/google-chrome/Default/Media Cache/data_0
0
SRINIVAS KATLA
lsof |grep (filename)

これにより、現在ファイルを使用しているプロセスが表示されます。

0
Matthew