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