descobre a localização de onde um processo foi executado

2

Eu tenho vários processos ruby em execução:

ps -A | grep ruby 
 3518 ?        00:00:12 ruby
10316 ?        00:00:00 ruby
22400 pts/5    00:00:45 ruby
23332 ?        00:00:07 ruby

Eu recebo o pid acima, mas eu quero saber onde esses processos estão no sistema de arquivos. Em outras palavras, onde eles foram executados.

Por que eu quero saber? Eu tenho um daemon rodando em uma tela de byobu e eu quero saber de onde ele foi executado.

byobu new -s daemon
ls -l
  -rwxrwxr-x 1 someuser someuser   83 Jul  2 11:13 db_service.sh
cat db_service.sh
  #!/bin/sh
  RAILS_ENV=production bundle exec ruby lib/daemons/db_service_ctl start
./script/db_service.sh

Como você pode ver nos comandos bash acima, um daemon foi gerado (daemon rails on rails) a partir do script de shell db_service.sh. Então, onde no sistema de arquivos foi gerado? O ps pode me ajudar aqui ou existe um programa melhor no linux para descobrir as informações desejadas? Eu não estou procurando o caminho da instalação do ruby, mas sim o caminho no qual uma instância do ruby foi executada

    
por JohnMerlino 10.07.2013 / 00:29

2 respostas

3

Então você tem o ID do processo, então você pode olhar em volta do sistema de arquivos /proc/ virtual. Tudo está lá. Por exemplo,

  • /proc/23124/cwd - o diretório atual do processo 23124
  • /proc/23124/cmdline - a linha de comando completa do processo.
por Dyno Fu 10.07.2013 / 01:16
1

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: /
    
por user76204 11.07.2013 / 20:06