我想列出一个目录中运行的所有进程。
例如,假设 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' ' '
请注意,您的命令不会列出目录中运行的进程。它列出了在该目录中(由 shell找到)其程序映像文件的进程,因此在它们的第 0 个命令参数中列出(或者恰好在它们的其他命令参数中提到了该目录)。这些进程当然不一定在该目录中运行。我将假设您想要的是您所要求的(假设您确实说过在目录中运行三遍),而不是您的命令实际执行的操作。
由于您没有指定操作系统:
FreeBSD/TrueOS 和 OpenBSD
使用
(仅)-f
选项fstat
使其按文件系统过滤,使用stat
命令获取所需目录的 inode 编号(${directory}
事先在 shell 变量中适当命名),并使用awk
后者作为wd
条目输出的过滤器fstat
:fstat
以超级用户身份运行,以包含其他用户的进程。Linux
两种方法:
-d
选项lsof
使其仅选择cwd
条目,使用stat
命令和一些dc
后处理来获取所需目录的 inode 编号和已安装的设备主要/次要编号(${directory}
事先在 shell 变量中适当命名),并awk
使用后者作为输出的过滤器lsof
: (仅)lsof
以超级用户身份运行,以包含其他用户的进程。fuser
在另一个答案中使用。使用
fuser -m /path/to/folder 2>/dev/null
(从输出中丢弃stderr
)或检查可用的用例man fuser