シェルスクリプトで使用すると、sleepコマンドは別のプロセスとして表示されますが、他のコマンドがそうでないように見えるのはなぜですか?

シェルスクリプトで使用すると、sleepコマンドは別のプロセスとして表示されますが、他のコマンドがそうでないように見えるのはなぜですか?

私はUbuntuで次のスクリプトを書いていますbashtest.sh

#!/bin/bash

while true; do
    echo 'abc'   # pwd, df...
    sleep 1
done

ある端末で実行すると、./test.sh別の端末を開き、次のコマンドを実行します。

$ pgrep test
31110
$ ps -ef | grep sleep
me       31140  31110  0 20:58 pts/1    00:00:00 sleep 1
me       31142  16389  0 20:58 pts/0    00:00:00 grep --color=auto sleep
$ ps -ef | grep sleep
me       31146  31110  0 20:58 pts/1    00:00:00 sleep 1
me       31148  16389  0 20:58 pts/0    00:00:00 grep --color=auto sleep
$ ps -ef | grep sleep
me       31150  31110  0 20:58 pts/1    00:00:00 sleep 1
me       31152  16389  0 20:58 pts/0    00:00:00 grep --color=auto sleep

したがって、プロセスのPID./test.shはです31110。コマンドを実行すると、このプロセスのすべての子である多くのプロセス(PIDは、、...)ps -ef | grep sleepを取得します。sleep 1311403114631150./test.sh

さて、今はすべてを理解できるようです。子プロセスはsleep 1ループから来ますwhile true

しかし、試してみるとps -ef | grep echo何も得られません。などpwdの他のコマンドも実行してみましたdfが、編集に失敗しましたgrep

だから私の質問はなぜこのコマンドsleepは別のプロセスであり、他のコマンドはそうではないのですか?

ベストアンサー1

ここで考慮すべき2つの側面があります。

  1. echo実際にはシェルの組み込みコマンドなpwdので、別のプロセスとして表示することはできません(たとえば、出力を参照してください)。bashtype echoできる外部実行可能ファイルとしてうまく実装され、組み込みまたは外部プログラムで実装または実装されていないことは、シェルによって異なります。
  2. df一方、シェルで実行されるコマンドは外部実行可能ファイル(たとえば)を呼び出します。はいそれは別のプロセスですが、通常は早すぎるため、「キャッチ」は困難ですps(つまり、ps起動時にすでに完了しているため、出力には表示されません)。

おすすめ記事