我如何获得 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 ----第一个文件夹还是第二个。
在 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 完毕