Ps

如何列出目錄中執行的所有程序的 PID?

  • February 24, 2018

我想列出一個目錄中執行的所有程序。

例如,假設 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' ' '

使用fuser -m /path/to/folder 2>/dev/null(從輸出中丟棄stderr)或檢查可用的案例man fuser

請注意,您的命令不會列出目錄中執行的程序。它列出了在該目錄中(由 shell找到)其程序映像文件的程序,因此在它們的第 0 個命令參數中列出(或者恰好在它們的其他命令參數中提到了該目錄)。這些程序當然不一定在該目錄中執行。我將假設您想要的是您所要求的(假設您確實說過在目錄中執行三遍),而不是您的命令實際執行的操作。

由於您沒有指定作業系統:

FreeBSD/TrueOS 和 OpenBSD

使用-f選項fstat使其按文件系統過濾,使用stat命令獲取所需目錄的 inode 編號(${directory}事先在 shell 變數中適當命名),並使用awk後者作為wd條目輸出的過濾器fstat

fstat -f "${目錄}" |
awk'{
if ($4 == "wd" && $6 == '"`stat -f %i \"${directory}\"`"' && !x[$3]++)
列印 3 美元;
}'

(僅)fstat以超級使用者身份執行,以包含其他使用者的程序。

Linux

兩種方法:

  • 使用該-d選項lsof使其僅選擇cwd條目,使用stat命令和一些dc後處理來獲取所需目錄的 inode 編號和已安裝的設備主要/次要編號(${directory}事先在 shell 變數中適當命名),並awk使用後者作為輸出的過濾器lsof
lsof -d cwd |
awk'{
if ($8 == '"`stat --format %i \"${directory}\"`"' \
&& $6 == "'"`dc -e \"16doi \`stat --format %D \"${目錄}\"\` 100~ rn[,]Pn\"`"'" \
&& !x[$2]++)
列印 2 美元;
}'

(僅)lsof以超級使用者身份執行,以包含其他使用者的程序。

  • fuser在另一個答案中使用。

引用自:https://unix.stackexchange.com/questions/426234