如何获取 pid 号和它所在的文件夹

K D*_*eis 2 process java pwd

我如何获得 PID 号和它工作的文件夹?

如果我在不同的文件夹中运行 2 个相同的程序:

/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>
Run Code Online (Sandbox Code Playgroud)

如果我运行这个命令 ps aux | grep test.jar

结果:

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
Run Code Online (Sandbox Code Playgroud)

我不知道是哪个 PID ----第一个文件夹还是第二个。

ilk*_*chu 5

在 Linux 上,您可以在/proc/$pid/cwd. 这是一个指向工作目录的神奇符号链接。/proc/$pid/cmdline给出进程的命令行,但它用 NUL 字节分隔,因此需要一些处理。你可以做例如这样的事情来获取一些符合某些pgrep条件的程序的工作目录和命令行:

for pid in $(pgrep -f test.jar); do
    echo "pid: $pid cwd: $(readlink "/proc/$pid/cwd") cmd: $(tr '\0' ' ' < "/proc/$pid/cmdline")"
done
Run Code Online (Sandbox Code Playgroud)

当然,如果你已经看到了如PID ps,只是ls -l /proc/<PID>/cwd还是readlink /proc/<PID>/cwd 会做。

您也可以使用lsof,但我不知道如何让它显示程序的命令行参数。

$ 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
Run Code Online (Sandbox Code Playgroud)

在 FreeBSD 上,这同样可以通过fstat命令获得,尽管获取实际路径有点棘手和慢:

对于 $(pgrep java) 中的 pid;做
    fstat -p "${pid}" | awk '{ if ($4 == "wd") 打印 '"${pid}"',$5,$6; }'
完成 | while read -r pid root inum ; 做
    printf "%s: " "${pid}"
    find -x "${root}" -type d -inum "${inum}" 2>/dev/null
完毕