私はUbuntuで次のスクリプトを書いていますbash
。test.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 1
31140
31146
31150
./test.sh
さて、今はすべてを理解できるようです。子プロセスはsleep 1
ループから来ますwhile true
。
しかし、試してみるとps -ef | grep echo
何も得られません。などpwd
の他のコマンドも実行してみましたdf
が、編集に失敗しましたgrep
。
だから私の質問はなぜこのコマンドsleep
は別のプロセスであり、他のコマンドはそうではないのですか?
ベストアンサー1
ここで考慮すべき2つの側面があります。
echo
実際にはシェルの組み込みコマンドなpwd
ので、別のプロセスとして表示することはできません(たとえば、出力を参照してください)。bash
type echo
できる外部実行可能ファイルとしてうまく実装され、組み込みまたは外部プログラムで実装または実装されていないことは、シェルによって異なります。df
一方、シェルで実行されるコマンドは外部実行可能ファイル(たとえば)を呼び出します。はいそれは別のプロセスですが、通常は早すぎるため、「キャッチ」は困難ですps
(つまり、ps
起動時にすでに完了しているため、出力には表示されません)。