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 que estão sendo acessados por um programa e seus filhos. 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 falhará se o comando a executar envolver sudo
. Não é muito inteligente (seria bom se pudesse listar apenas os arquivos existentes ou com problemas de permissão ou agrupá-los em arquivos lidos e escritos). Também strace
é lento, por isso seria bom com uma escolha mais rápida.
files
monitoring
strace
Ole Tange
fonte
fonte
strace
, presumo que você esteja especificamente interessado no Linux. Corrigir?Respostas:
Desisti e codifiquei minha própria ferramenta. Para citar seus documentos:
Ele gera apenas os arquivos, assim você não precisa lidar com a saída de
strace
.https://gitlab.com/ole.tange/tangetools/tree/master/tracefile
fonte
make && sudo make install
. Então você pode correrman tracefile
.yum -y install https://extras.getpagespeed.com/release-el7-latest.rpm
eyum -y install tracefile
Você pode rastrear as chamadas do sistema
strace
, mas há realmente uma penalidade de velocidade inevitável. Você precisa executarstrace
como root se o comando for executado com privilégios elevados:Outro método que é provável que seja mais rápido é para pré-carregar uma biblioteca que envolve funções de acesso do sistema de arquivos:
LD_PRELOAD=/path/to/libmywrapper.so mycommand
. ALD_PRELOAD
variável de ambiente não será passada para programas invocados com privilégios elevados. Você precisaria escrever o código dessa biblioteca de invólucros ( aqui está um exemplo de "Construindo interpositores de bibliotecas 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, poderá fazer uma visualização do sistema de arquivos com o LoggedFS , de forma que todos os acessos através dessa visualização sejam registrados.
Para configurar o LoggedFS, inicie com a configuração de amostra fornecida com o programa e leia a sintaxe do arquivo de configuração do LoggedFS .
Outra possibilidade é o subsistema de auditoria do Linux . Verifique se o
auditd
daemon foi iniciado e, em seguida, configure com o qual deseja fazer logonauditctl
. Cada operação registrada é registrada em/var/log/audit/audit.log
(em distribuições típicas). Para começar a assistir um arquivo específico:Se você colocar uma observação em um diretório, os arquivos nele e seus subdiretórios recursivamente também serão observados. Tome cuidado para não observar o diretório que contém os logs de auditoria. Você pode restringir o log a certos processos, consulte a
auditctl
página do manual para os filtros disponíveis. Você precisa ser root para usar o sistema de auditoria.fonte
LD_PRELOAD
também não funcionará em binários estáticos.Eu acho que você quer lsof (possivelmente canalizado para um grep no programa e em crianças). Ele informará todos os arquivos que estão sendo acessados no momento no sistema de arquivos. Para obter informações sobre quais arquivos acessados por processo ( daqui ):
fonte
Eu tentei isso
tracefile
. Para mim, deu muito menos resultados que os meusstrace ... | sed ... | sort -u
. Eu até adicionei-s256
astrace(1)
linha de comando, mas não ajudou muito ...Então eu tentei isso
loggedfs
. Primeiro, ele falhou, pois não tinha acesso de leitura / gravação ao diretório que tentei fazer logon. Depois de fazer o chmod 755 temporariamente, recebi alguns hits ...Mas, para mim, fazer o seguinte parece funcionar melhor:
inotifywait -m -r -e OPEN /path/to/traced/directory
E depois processe a saída após executar o processo de seu interesse.
Isso não captura o acesso externo ao processo de arquivos do diretório rastreado, nem sabe se algum outro processo acessou a mesma árvore de diretórios, mas em muitos casos isso é uma ferramenta boa o suficiente para fazer o trabalho.
EDIT: inotifywait não captura o acesso de link simbólico (apenas os destinos após a resolução dos links simbólicos). Fui atingido por isso quando arquivei bibliotecas acessadas por um programa para uso futuro. Utilizamos alguns hackers perl glob extras para selecionar os links simbólicos nas bibliotecas notificadas para concluir o trabalho nesse caso específico.
EDIT2: pelo menos quando inotifying arquivos e os próprios links simbólicos de linha de comando inotifywait (por exemplo,
inotifywait -m file symlink
ouinotifywait symlink file
) saída mostrará o acesso a qual é o primeiro na linha de comando (independentemente de qual,file
desymlink
for acessado). O inotifywait não suporta IN_DONT_FOLLOW - que, quando tentei programaticamente, apenas faz com que se veja acessofile
(o que pode ou não ser o que se espera ...) independentemente da ordem na linha de comandofonte
tracefile
falta de acesso a um arquivo?Embora possa não lhe dar controle suficiente (ainda?) Eu escrevi um programa que, pelo menos parcialmente, atende às suas necessidades, usando o fanotify e o desshare do linux-kernel para monitorar apenas arquivos modificados (ou lidos) por um processo específico e seus filhos . Comparado ao strace, é bastante rápido (;
Pode ser encontrado em https://github.com/tycho-kirchner/shournal
Exemplo no shell:
fonte