
Ubuntuシステムで現在のプロセスを表示する方法を知っています。たとえば、1つを実行状態にすることができます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は一度実行されます。タスクを繰り返すための独自の内部タイマーがありますが、同じプロセスは、回数が期限切れになるか、オプションに従って終了するまでそのまま残ります。
ホストは組み込みシェルではなく外部コマンドなので、子プロセスとは何の関係もありません。しかし、完了するには50,000回の実行が必要でした。探してみると、ps | grep
プロセステーブルにいる確率は約1%程度だ。ループでpsを実行すると、最終的にいくつかのヒットが表示されることがあります。 2つの診断プロセスを実行すると、特定のスケジューラの制限により、プロセス生成がhost
psと同期しないことがあります。