FreeBSD/TrueOS 和 OpenBSD

FreeBSD/TrueOS 和 OpenBSD

我想列出目录中正在运行的所有进程。

例如,假设 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后者作为以下条目输出的过滤wdfstat

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/nullstderr从输出中丢弃)或检查可用的用例man fuser

相关内容