Ps

ps 是否提供每個程序的工作目錄?

  • July 30, 2018

呼叫每個作業時的輸出包含工作目錄是否正確jobs(不一定是每個作業的目前工作目錄)?

$ jobs -l | grep JDBC
[15]  20422 Running   PDFXCview all.pdf &  (wd: ~/mydata/dirlinks/cs/SQL/API/JDBC/general/official/tutorials)
[20]  20542 Running   PDFXCview all.pdf &  (wd: ~/mydata/dirlinks/cs/SQL/API/JDBC/general/wikipedia)

同理,在ps,呼叫時是否可以獲取到每個程序之前的工作目錄

pgrep中,是否可以在呼叫它時搜尋每個程序的上一個工作目錄的路徑名(字元串),例如pgrep ... <pattern_in_working_dir_pathname>

我想在呼叫它們時通過工作目錄中的關鍵字搜尋程序

謝謝。

許多作業系統中的其他程序都可以知道程序的工作目錄。它們可以分別使用sysctl()和從 BSD 和 Linux 的核心中查詢procfs。但是,ps來自 procps 的 Linux 命令和psBSD 中的命令都不會獲取和報告此資訊。

要獲取 BSD 上程序的目前目錄,命令是fstat,它報告文件系統和 i-node 編號。

% fstat -p $$|awk '{ if ("wd" == $4 || 1 == NR) 列印;}'
USER CMD PID FD MOUNT INUM MODE SZ|DV R/W
JdeBP zsh 71512 wd /usr/home/JdeBP 4 drwxr-xr-x 127 r
%

請注意,當然,可以通過多個名稱訪問工作目錄,並且這些名稱可以隨著事物的重命名和連結的創建/銷毀而變化。它們中穩定的部分是文件對象,即 vnode,而不是到達它的目錄條目。

因此,在 中報告一個名稱的 Linux 機制不一定可靠。/proc/*pid*/cwd

最後:請注意,程序的目前目錄不一定是它在生成程序時所擁有的工作目錄,這是作業控制 shell實際上知道的所有內容。

進一步閱讀

如果該目錄與 shell 的目前目錄不同,該jobs命令可能會顯示程序*啟動的工作目錄。*那是因為 shell 正在跟踪它所知道的(程序從哪裡開始),而不是目前狀態。

它也依賴於外殼。

例如與bash

bash-4.4$ cd /tmp
bash-4.4$ sleep 1000 &
[1] 24807
bash-4.4$ jobs -l
[1]+ 24807 Running                 sleep 1000 &
bash-4.4$ cd /
bash-4.4$ jobs -l
[1]+ 24807 Running                 sleep 1000 &  (wd: /tmp)

ksh93不這樣做

$ sleep 1000 &
[1]     7164
$ jobs -l
[1] + 7164       Running                 sleep 1000 &
$ cd /
$ jobs -l
[1] + 7164       Running                 sleep 1000 &
$ 

我不相信有任何攜帶式方法可以找到程序的 cwd。 fstatpwdx類似的可能會有所幫助。您可能需要root特權才能查看您不擁有的程序。

在 Linux 上,可以通過查看/proc/.../cwd符號連結來使用匹配特定路徑的程序:

/tmp例如在路徑中查找程序:

% sudo ls -l /proc/*/cwd | grep /tmp
lrwxrwxrwx. 1 sweh     sweh     0 Jul 28 09:38 /proc/23435/cwd -> /news/tmp
lrwxrwxrwx. 1 sweh     sweh     0 Jul 28 09:39 /proc/7124/cwd -> /news/tmp

請記住,由於符號連結,這可能與程序的目錄內部表示不匹配:

$ cd /usr/tmp
$ pwd
/usr/tmp
$ ls -l /proc/self/cwd
lrwxrwxrwx. 1 sweh sweh 0 Jul 28 09:41 /proc/self/cwd -> /var/tmp/
$ ls -l /usr/tmp
lrwxrwxrwx 1 root root 10 May 13 09:39 /usr/tmp -> ../var/tmp/
$ 

在這裡,shell 認為我在其中,/usr/tmp但實際上它是/var/tmp.

編輯添加:

這個問題有一個特殊情況,問題可能是“哪些程序正在使用掛載點”。這不是報告,cwd而是任何可能打開的文件。

因此,例如:

$ sudo fuser -u -c /brick
/brick:               3552(root)
$ ps -p 3552
 PID TTY          TIME CMD
3552 ?        00:04:51 glusterfsd
$

我們知道該glusterfsd程序是唯一使用/brick文件系統的程序

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