如何获取 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>/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
在 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
解释
pgrep pattern
- 查看当前正在运行的进程并列出与模式匹配的进程 ID。- -x, --精确- 仅匹配名称与模式完全匹配的进程。
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。