我知道如何查看 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)
...
看不到任何可以解释它的东西。我错过了什么?!感谢您帮助提高我的理解!
答案1
ping 运行一次:它有自己的内部计时器来重复该任务,但相同的进程会保留在那里,直到计数到期,或者根据选项杀死它。
Host是一个外部命令,不是内置的shell,所以这与子进程无关。但它运行了 50,000 次才能完成。当ps | grep
寻找它时,它在进程表中的概率大概是1%。如果您也循环运行 ps,您最终可能会看到一些命中。运行两个诊断进程时,由于某些调度程序限制,进程的创建host
可能永远不会与 ps 同步。