如何获取 pid 号和它工作的文件夹

如何获取 pid 号和它工作的文件夹

如何获取 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>

如果我运行这个命令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

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

答案1

在 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

当然,如果您已经使用eg查找PID ps,则只需使用ls -l /proc/<PID>/cwdreadlink /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

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

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

答案2

pgrep -x program_name_pattern | xargs pwdx

解释

  1. pgrep pattern- 查看当前正在运行的进程并列出与模式匹配的进程 ID。
    • -x, --精确- 仅匹配名称与模式完全匹配的进程。
  2. pwdx- 报告进程的当前工作目录。

测试

pgrep -x my_program | xargs pwdx

###Output###
15880: /home/minimax/Desktop/sandbox
15907: /home/minimax/Desktop/sandbox/yet_one_folder

答案3

lsof你的朋友在这里吗:

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

第二列显示 PID。

相关内容