ps
是否提供每個程序的工作目錄?
呼叫每個作業時的輸出包含工作目錄是否正確
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 命令和ps
BSD 中的命令都不會獲取和報告此資訊。要獲取 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。
fstat
,pwdx
類似的可能會有所幫助。您可能需要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
文件系統的程序