Mesmo que /proc
tenha sido mencionado brevemente acima como uma fonte de informações para aprender sobre processos em um sistema, incluo aqui um script Bash básico para analisar algumas informações dele. Para obter uma introdução excelente ao sistema de arquivos /proc
virtual, consulte artigo da IBM , que explica como isso pode ser útil para usuários e programadores.
Analisar /proc
com um script genérico pode não ser confiável, já que processos diferentes geralmente têm layouts /proc
diferentes, mas informações básicas geralmente podem ser obtidas com esse script, embora possa ser necessário modificá-lo se você quiser analisar outras informações específicas. Eu escrevi usando o Bash, mas existem melhores parsers que você poderia investigar se você quiser escrevê-lo usando uma linguagem de script diferente.
Geralmente, na saída do script, você vê uma mensagem de "permissão negada", o que significa que /proc
location não é legível por $ USER, portanto, você pode executar o script como root, se quiser, a saída completa.
Copie o corpo do script em um novo arquivo, salve-o e torne-o executável ( chmod u+x
) e, em seguida, chame-o com pelo menos um argumento (agora ele pode manipular vários processos ao mesmo tempo):
./proc_script xfce4-panel
ou coloque-o no seu $HOME/bin
e então você pode executá-lo como outros programas se $HOME/bin
estiver no seu caminho. (No entanto, se você usar o sudo, ainda terá que fornecer o local do caminho absoluto do script, pois $HOME/bin
não está no caminho da raiz).
O corpo do roteiro; Ele também está disponível e atualizado em minha página do Github :
#!/usr/bin/env bash
(( $# == 0 )) && { printf "Usage: Please specify the name of one process \
to research.\n" >&2; exit 1; }
args=("$@")
for process in "${args[@]}"; do
# store user input in a variable and warn then exit if program is not running
queried_pid="$(pgrep "${process}" || { printf '%s\n' "No such program" >&2; })"
# add the contents of the variable into an array
pidarray=($(echo "$queried_pid"))
# iterate over the array, however many pids have been found
for i in "${pidarray[@]}"; do
printf "Pid is: %s\nExe is: %s\nCmdline is: %s\ncwd is: %s\n" "$(echo "$i")" \
"$(stat -c %N /proc/"$i"/exe)" "$(cat /proc/"$i"/cmdline)" "$(cd /proc/"$i"/cwd/; pwd -P)"
done
printf "\n\n"
done
exit
Exemplo de saída 1:
./proc_parse firefox
Pid is: 1830
Exe is: '/proc/1830/exe' -> '/usr/lib/firefox/firefox'
Cmdline is: /usr/lib/firefox/firefox
cwd is: /home/mike
Exemplo de saída 2 (lidando com vários pids):
./proc_parse evince
Pid is: 3113
Exe is: '/proc/3113/exe' -> '/usr/bin/evince'
Cmdline is: evince/home/mike/Z_IBM_lpic_Linux_pdfs/l-proc-pdf.pdf
cwd is: /home/mike
Pid is: 3119
Exe is: '/proc/3119/exe' -> '/usr/lib/evince/evinced'
Cmdline is: /usr/lib/evince/evinced
cwd is: /