Existe alguma maneira de acompanhar todos os processos exec'd por bash

4

Gostaria de poder manter estatísticas sobre quais programas eu executo mais através do bash. Existe alguma maneira de inserir algum tipo de gancho no bash para que ele registre tudo que é executado?

Note que olhar através do arquivo de histórico do bash não é bom o suficiente. Eu posso imprimir o primeiro token de cada linha do histórico, mas isso não tem pipelines e processo de substituição. Eu gostaria do seguinte:

$ ls /usr/bin/* | fgrep $(echo grep)

para registrar que ls , fgrep e echo foram executados uma vez. E o seguinte:

$ for file in /usr/bin/*; do stat $file; echo $file; done

deve notar que stat e echo foram executados. Como for é uma instrução de controle de fluxo bash, ela não seria registrada.

É discutível se os built-ins e funções do shell devem ser registrados (talvez apenas registrados com uma nota sobre o que eles eram). Também é discutível se stat e echo devem ser registrados uma vez ou quantas vezes o loop for executado no exemplo acima. Mas eu poderia trabalhar com a saída de qualquer maneira que fosse mais fácil.

A execução do bash com -x mostra que ele possui algum mecanismo interno para conectar-se ao processo exec e registrar o que está acontecendo. Existe outra maneira de entrar lá?

    
por onlynone 24.02.2015 / 17:26

3 respostas

2

Como primeiro corte,

strace -e execve -b execve -f -qqv -e signal='!all' bash 

para uso não-mais frio você teria que redirecionar o stderr para algum cachimbo logger, ou colocar algum diretório ruim em algum lugar com arquivos usando -o do strace, talvez -o ~/commandtraces/$(date +%Y%m%d%H%M%S).$$

Para fazer isso para todos os shells interativos, estou pensando que você precisaria de uma variável de guarda no seu .bashrc para evitar a recursão.

    
por 25.02.2015 / 23:40
0

Quando é o seu sistema local, e você está com muito cuidado, você pode substituir todos os arquivos / usr / bin por wrappers.
Algo como

cp -pr /usr/bin /usr/orgbin
cd /usr/bin
for f in *; do
   echo "/usr/orgbin/echo $f used >> /tmp/bin_usage.out" > $f
   chmod +x $f
done

Primeiro tente com 2 programas inocentes?

    
por 25.02.2015 / 21:44
-1

Você pode usar o gancho PROMPT_COMMAND para inserir algo que registrará o último comando digitado. Esse log pode ser feito com a ajuda do comando logger .

Algo como export PROMPT_COMMAND="logger 'history 1'"

    
por 24.02.2015 / 17:53

Tags