Command-Line
如何查看“主機”和類似命令的程序資訊
我知道如何查看我的 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 同步。