Como obter o número e a pasta do pid onde ele funciona

1

Como posso obter o número e a pasta do PID onde funciona?

Se eu executar 2 mesmos programas em pastas diferentes:

/var/www/public_html/first_folder/test.jar <i>(it runs all the time)</i>
/var/www/public_html/second_folder/test.jar <i>(it runs all the time)</i>

Se eu executar este comando ps aux | grep test.jar

Resultado:

www-data  3766  0.5  3.8 2959916 75616 ?       Sl   15:01   0:13 java -jar test.jar

www-data  4239  3.4  4.1 2959916 82432 ?       Sl   15:31   0:18 java -jar test.jar

Eu não sei qual é o PID - primeira pasta ou segundo.

    
por K Deis 20.12.2017 / 14:43

3 respostas

0
pgrep -x program_name_pattern | xargs pwdx

Explicação

  1. pgrep pattern - examina os processos atualmente em execução e lista os IDs do processo que correspondem ao padrão.
    • -x, --exact - corresponde apenas processos cujos nomes correspondem exatamente ao padrão.
  2. pwdx - relata o diretório de trabalho atual de um processo.

Teste

pgrep -x my_program | xargs pwdx

###Output###
15880: /home/minimax/Desktop/sandbox
15907: /home/minimax/Desktop/sandbox/yet_one_folder
    
por 21.12.2017 / 00:31
5

No Linux, você pode encontrar o diretório de trabalho de um processo em /proc/$pid/cwd . É um link simbólico mágico que aponta para o diretório de trabalho. /proc/$pid/cmdline fornece a linha de comando do processo, mas é separado com bytes NUL, portanto, precisa de algum processamento. Você poderia fazer, por exemplo algo assim para obter os diretórios de trabalho e as linhas de comando de vários programas que correspondem a uma condição pgrep :

for pid in $(pgrep -f test.jar); do
    echo "pid: $pid cwd: $(readlink "/proc/$pid/cwd") cmd: $(tr '
$ lsof -a -d cwd -c cat
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
cat     30693 someuser  cwd    DIR  253,1     4096 1700752 /tmp/y
cat     30694 someuser  cwd    DIR  253,1     4096 1700611 /tmp
' ' ' < "/proc/$pid/cmdline")" done

Claro, se você já procurou o PID com, por exemplo, ps , apenas ls -l /proc/<PID>/cwd ou readlink /proc/<PID>/cwd  faria.

Você também pode usar lsof , mas não sei como mostrar o comando argumentos de linha do programa.

for pid in $(pgrep java); do
    fstat -p "${pid}" | awk '{ if ($4 == "wd") print '"${pid}"',$5,$6; }'
done | while read -r pid root inum ; do
    printf "%s: " "${pid}"
    find -x "${root}" -type d -inum "${inum}" 2>/dev/null
done

No FreeBSD, isto é similarmente obtido através do comando fstat , embora o caminho real seja um pouco mais complicado e lento:

for pid in $(pgrep -f test.jar); do
    echo "pid: $pid cwd: $(readlink "/proc/$pid/cwd") cmd: $(tr '
$ lsof -a -d cwd -c cat
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
cat     30693 someuser  cwd    DIR  253,1     4096 1700752 /tmp/y
cat     30694 someuser  cwd    DIR  253,1     4096 1700611 /tmp
' ' ' < "/proc/$pid/cmdline")" done
    
por 20.12.2017 / 15:03
0

lsof é seu amigo aqui:

lsof -c java | grep /var/www/public_html

A segunda coluna mostra o PID.

    
por 20.12.2017 / 15:00