我想列出目录中正在运行的所有进程。
例如,假设 3 三个进程正在运行:
/home/myname/myapp/process1
/home/myname/myapp/process2
/home/myname/myapp/anotherprocess
我如何询问系统:“给我运行中的所有进程的PID /home/myname/myapp
”?
我能想到的唯一方法是
ps -eo pid,args | grep -i /home/myname/myapp | awk '{print $1}' | tr '\n' ' '
答案1
请注意您的命令才不是列出目录中运行的进程。它列出了其程序映像文件的进程被发现(通过 shell)在该目录中,因此在第 0 个命令参数中列出(或者碰巧在其他命令参数中提到了该目录)。这些进程当然不一定在该目录中运行。我假设你想要你所要求的(鉴于你确实说过在目录中运行三遍),而不是您的命令实际执行的操作。
由于您尚未指定操作系统:
FreeBSD/TrueOS 和 OpenBSD
使用-f
选项 来fstat
按文件系统进行过滤,使用该stat
命令获取所需目录的 inode 号(${directory}
预先在 shell 变量中适当命名),并使用awk
后者作为以下条目输出的过滤wd
器fstat
:
fstat -f "${目录}" | awk '{ if ($4 == "wd" && $6 == '"`stat -f %i \"${目录}\"`"' && !x[$3]++) 打印 3 美元; }'(仅)
fstat
以超级用户身份运行,以便包含其他用户的进程。
Linux
两种方法:
- 使用该
-d
选项使其lsof
仅选择cwd
条目,使用该stat
命令和一些dc
后处理来获取所需目录的 inode 编号和已安装设备的主/次编号(${directory}
预先在 shell 变量中适当命名),然后awk
使用后两者作为 的输出的过滤器lsof
:lsof -d cwd | lsof -d cwd | awk '{ if ($8 == '"`stat --format %i \"${目录}\"`"' \ && $6 == "'"`dc -e \"16doi \`stat --format %D \"${目录}\"\` 100~ rn[,]Pn\"`"'" \ && !x[$2]++) 打印 2 美元; }'
(仅)lsof
以超级用户身份运行,以便包含其他用户的进程。 fuser
正如在另一个答案中一样使用。
答案2
使用fuser -m /path/to/folder 2>/dev/null
(stderr
从输出中丢弃)或检查可用的用例man fuser