Command-Line

如何查看“主機”和類似命令的程序資訊

  • February 9, 2021

我知道如何查看我的 Ubuntu 機器上的目前程序。例如,我可以離開ping跑步:

ping localhost

然後做:

$ ps -ef | grep ping

這表明:

user1      2875    1231  0 Feb08 ?        00:00:03 /usr/libexec/gsd-housekeeping
user2     96834   43257  0 14:21 pts/4    00:00:00 ping localhost
root       96837   63560  0 14:21 pts/1    00:00:00 grep --color=auto ping

但是host命令呢?我讓它循環執行:

for i in {1..50000}; do host localhost; done

然後做:

$ps aux | grep host

但我得到的只是:

root       98021   63560  0 14:24 pts/1    00:00:00 grep --color=auto host

是的,我什至以 root 身份嘗試過!當然,我可以看到名稱解析器,但它始終處於打開狀態:

$ ps -ef | grep resolv
systemd+    1015       1  0 Feb08 ?        00:00:17 /lib/systemd/systemd-resolved

我不應該也看host/usr/bin/host嗎?

順便說一句,與ls. 我知道這些命令有點特殊,有點“內置”,但我認為它們會像任何其他程序一樣被對待?不像cd有一個實際的執行檔。我跑strace過去:

execve("/usr/bin/host", ["host", "localhost"], 0x7ffdf51ee518 /* 58 vars */) = 0
brk(NULL)                               = 0x559cc809a000
arch_prctl(0x3001 /* ARCH_??? */, 0x7ffd20032c70) = -1 EINVAL (Invalid argument)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
...

看不到任何可以解釋它的東西。我錯過了什麼?!感謝您幫助提高我的理解!

ping 執行一次:它有自己的內部計時器來重複任務,但相同的程序會一直留在那裡,直到計數到期,或者你殺死它,具體取決於選項。

主機是一個外部命令,不是內置的shell,所以這與子程序無關。但它執行完成 50,000 次。在查找它時,它在程序表中的機率ps | grep可能是 1%。如果您也在循環中執行 ps,您最終可能會看到一些命中。執行兩個診斷程序是host可能的,由於某些調度程序限制,程序的創建可能永遠不會與 ps 同步。

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