O 'ps' fornece o diretório de trabalho de cada processo?

0

É correto que a saída de jobs contenha o diretório de trabalho ao invocar cada trabalho (não necessariamente o diretório de trabalho atual de cada trabalho)?

$ jobs -l | grep JDBC
[15]  20422 Running   PDFXCview all.pdf &  (wd: ~/mydata/dirlinks/cs/SQL/API/JDBC/general/official/tutorials)
[20]  20542 Running   PDFXCview all.pdf &  (wd: ~/mydata/dirlinks/cs/SQL/API/JDBC/general/wikipedia)

Da mesma forma, em ps , é possível obter o diretório de trabalho anterior de cada processo ao invocá-lo

Em pgrep , é possível pesquisar no nome do caminho (string) do diretório de trabalho anterior de cada processo ao invocá-lo, como pgrep ... <pattern_in_working_dir_pathname> ?

Eu gostaria de procurar por processos, por palavras-chave em seus diretórios de trabalho quando invocá-los

Obrigado.

    
por Tim 28.07.2018 / 03:46

3 respostas

1

Os diretórios de trabalho dos processos são conhecidos por outros processos em muitos sistemas operacionais. Eles são consultáveis a partir do kernel nos BSDs e no Linux, usando sysctl() e procfs , respectivamente. No entanto, nem o comando ps do Linux do procps nem os comandos ps nos BSDs obtêm e reportam essa informação.

Para obter o diretório atual de um processo nos BSDs, o comando é fstat , que informa o sistema de arquivos e o número do nó i.

% fstat -p $$|awk '{ if ("wd" == $4 || 1 == NR) print; }'
USER     CMD          PID   FD MOUNT      INUM MODE         SZ|DV R/W
JdeBP    zsh        71512   wd /usr/home/JdeBP      4 drwxr-xr-x     127  r
% 

Observe que, é claro, os diretórios de trabalho podem ser acessados por vários nomes e esses nomes podem variar conforme as coisas são renomeadas e os links são criados / destruídos. A parte estável deles é o objeto de arquivo, o vnode, não as entradas de diretório para alcançá-lo.

Portanto, o mecanismo do Linux, que informa um nome em /proc/pid/cwd , não é necessariamente confiável.

Finalmente: note que o diretório atual de um processo não é necessariamente o diretório de trabalho que ele tinha quando o processo foi gerado, que é todo aquele shells de controle de trabalho na verdade sabe.

Leitura adicional

por 28.07.2018 / 13:19
1

O comando jobs pode mostrar o diretório de trabalho do programa iniciado , se esse diretório for diferente do diretório atual. Isso porque o shell está rastreando o que ele sabe (onde o processo começou), não o estado atual.

Também depende do shell.

por exemplo, com bash

bash-4.4$ cd /tmp
bash-4.4$ sleep 1000 &
[1] 24807
bash-4.4$ jobs -l
[1]+ 24807 Running                 sleep 1000 &
bash-4.4$ cd /
bash-4.4$ jobs -l
[1]+ 24807 Running                 sleep 1000 &  (wd: /tmp)

Mas ksh93 não faz isso

$ sleep 1000 &
[1]     7164
$ jobs -l
[1] + 7164       Running                 sleep 1000 &
$ cd /
$ jobs -l
[1] + 7164       Running                 sleep 1000 &
$ 

Eu não acredito que exista uma maneira portátil de encontrar o cwd de um processo. fstat , pwdx e similares podem ajudar. Você pode precisar de root privileges para ver os processos que não possui.

No Linux, os processos que correspondem a um caminho específico podem ser usados consultando o /proc/.../cwd symlink:

por exemplo, para encontrar processos com /tmp no caminho:

% sudo ls -l /proc/*/cwd | grep /tmp
lrwxrwxrwx. 1 sweh     sweh     0 Jul 28 09:38 /proc/23435/cwd -> /news/tmp
lrwxrwxrwx. 1 sweh     sweh     0 Jul 28 09:39 /proc/7124/cwd -> /news/tmp

Lembre-se de que isso pode não corresponder à representação interna do processo do diretório devido a links simbólicos:

$ cd /usr/tmp
$ pwd
/usr/tmp
$ ls -l /proc/self/cwd
lrwxrwxrwx. 1 sweh sweh 0 Jul 28 09:41 /proc/self/cwd -> /var/tmp/
$ ls -l /usr/tmp
lrwxrwxrwx 1 root root 10 May 13 09:39 /usr/tmp -> ../var/tmp/
$ 

Aqui, o shell acha que estou em /usr/tmp , mas na verdade é /var/tmp .

EDITAR PARA ADICIONAR:

Há um caso especial desse problema, em que a questão pode ser "quais processos estão usando um ponto de montagem". Isso não está reportando o cwd , mas quaisquer arquivos que possam estar abertos.

Então, por exemplo:

$ sudo fuser -u -c /brick
/brick:               3552(root)
$ ps -p 3552
  PID TTY          TIME CMD
 3552 ?        00:04:51 glusterfsd
$

Sabemos que o processo glusterfsd é o único que usa o /brick filesystem

    
por 28.07.2018 / 15:42
0

Não há uma maneira portátil de fazer isso com ps , mas é possível usar um loop for com ps para imprimir todos os processos e encaminhá-lo para outro comando para imprimir seus diretórios de trabalho atuais.

Vamos começar com pwdx , que imprime especificamente o diretório de trabalho atual de um processo.

Rodando como root:

for i in $(ps aux | awk '{print $2}'); do pwdx $i; done

ps aux | awk '{print $2}' imprime o pid para cada processo.

pwdx $i Passa a variável i que é o pid para pwdx

Você pode usar pwdx em um pid, mas o loop for faz todos juntos.

Você também pode usar lsof , mas pode ser necessário instalar o pacote lsof primeiro, dependendo do seu sistema. Rodando como root:

for i in $(ps aux | awk '{print $2}'); do lsof -p $i | grep cwd; done

ps aux | awk '{print $2}' imprime o PID para cada processo.

lsof -p $i Passa a variável i para lsof

grep cwd Imprime as linhas contendo cwd ou o diretório de trabalho atual.

Em relação ao comando pgrep , você pode usá-lo na forma de:

pgrep <process-name>

em ordem também encontrar o pid de um processo, mas você ainda terá que passá-lo para lsof ou pwdx para encontrar o diretório de trabalho atual.

O primeiro for loop funciona com o Fedora 28, o Centos 7.5, o RHEL 7.5 e o Debian 9, mas não com o FreeBSD 11.

O segundo for loop funciona com o Fedora 28, o Centos 7.5, o RHEL 7.5 eo Debian 9. Ele também funciona com o FreeBSD 11.1, embora no meu caso, imprima mensagens de aviso sobre a versão lsof do FreeBSD 11 enquanto o meu é o FreeBSD 11.1

    
por 28.07.2018 / 04:09

Tags