Listar os arquivos acessados por um programa

51

time é um comando brilhante se você quiser descobrir quanto tempo de CPU um determinado comando leva.

Estou procurando algo semelhante que possa listar os arquivos acessados por um programa e seus filhos. Seja em tempo real ou como um relatório depois.

Atualmente eu uso:

#!/bin/bash

strace -ff -e trace=file "$@" 2>&1 | perl -ne 's/^[^"]+"(([^\"]|\[\"nt])*)".*/$1/ && print'

mas falha se o comando a ser executado envolver sudo . Não é muito inteligente (seria bom se pudesse listar apenas arquivos existentes ou que tivessem problemas de permissão ou agrupá-los em arquivos que são lidos e arquivos que foram gravados). Também strace é lento, então seria bom com uma escolha mais rápida.

    
por Ole Tange 16.08.2011 / 16:51

4 respostas

41

Eu desisti e codifiquei minha própria ferramenta. Para citar seus documentos:

SYNOPSIS
    tracefile [-adefnu] command
    tracefile [-adefnu] -p pid

OPTIONS
    -a        List all files
    -d        List only dirs
    -e        List only existing files
    -f        List only files
    -n        List only non-existing files
    -p pid    Trace process id
    -u        List only files once

Produz somente os arquivos para que você não precise lidar com a saída de strace .

link

    
por 14.03.2012 / 19:56
24

Você pode rastrear as chamadas do sistema com strace , mas há, de fato, uma inevitável penalidade de velocidade. Você precisa executar strace como root se o comando for executado com privilégios elevados:

sudo strace -f -o foo.trace su user -c 'mycommand'

Outro método que provavelmente será mais rápido é pré-carregar uma biblioteca que contorne as funções de acesso ao sistema de arquivos: LD_PRELOAD=/path/to/libmywrapper.so mycommand . A variável de ambiente LD_PRELOAD não será transmitida para programas invocados com privilégios elevados. Você teria que escrever o código dessa biblioteca wrapper ( aqui está um exemplo de "Construindo biblioteca interposers para diversão e lucro ”); Não sei se há código reutilizável disponível na Web.

Se você estiver monitorando os arquivos em uma hierarquia de diretórios específica, será possível visualizar o sistema de arquivos com LoggedFS que todos os acessos através dessa visão são registrados.

loggedfs -c my-loggedfs.xml /logged-view
mycommand /logged-view/somedir

Para configurar o LoggedFS, inicie com a configuração de amostra fornecida com o programa e leia Sintaxe do arquivo de configuração do LoggedFS .

Outra possibilidade é o subsistema de auditoria do Linux. Certifique-se de que o daemon auditd foi iniciado e configure o que você deseja registrar com auditctl . Cada operação registrada é registrada em /var/log/audit/audit.log (em distribuições típicas). Para começar a assistir a um arquivo específico:

auditctl -a exit,always -w /path/to/file

Se você colocar um relógio em um diretório, os arquivos nele e seus subdiretórios serão também assistidos de forma recursiva. Tome cuidado para não observar o diretório que contém os logs de auditoria. Você pode restringir o registro a determinados processos, consulte a página auditctl man para os filtros disponíveis. Você precisa ser root para usar o sistema de auditoria.

    
por 17.08.2011 / 01:02
6

Eu acho que você quer lsof (possivelmente canalizado para um grep no programa e são crianças). Ele irá dizer-lhe todos os arquivos que estão sendo acessados no sistema de arquivos. Para obter informações sobre quais arquivos acessados por processo ( daqui ) :

lsof -n -p 'pidof your_app'
    
por 16.08.2011 / 21:51
1

Eu tentei esse tracefile . Para mim, deu muito menos correspondências do que o meu próprio strace ... | sed ... | sort -u . Eu até adicionei a linha de comando -s256 to strace(1) mas isso não ajudou muito ...

Então eu tentei esse loggedfs . Primeiro ele falhou, pois eu não tinha acesso de leitura / gravação para o diretório que tentei registrar com ele. Depois de fazer chmod 755 temporariamente eu consegui alguns hits ...

Mas, para mim, fazer o seguinte parece funcionar melhor:

inotifywait -m -r -e OPEN /path/to/traced/directory

E, em seguida, pós-processe a saída depois de executar o processo de interesse.

Isso não captura a terceirização de acesso ao processo de arquivos do diretório rastreado nem isso não sabe se algum outro processo acessou a mesma árvore de diretórios, mas em muitos casos esta é uma ferramenta boa o suficiente para fazer o trabalho.

EDIT: inotifywait não captura o acesso ao symlink (apenas os alvos após symlinks resolvidos). Eu fui atingido por isso quando arquivei bibliotecas acessado por um programa para uso futuro. Usado algum hackery extra do perl glob para escolher os links simbólicos ao longo das bibliotecas notificadas para obter o trabalho feito nesse caso particular.

    
por 26.09.2018 / 21:34