Bash 端末でこのコマンドを実行します。
while [ 0 ]; do
i=1;
echo $i;
done
このループを実行する前に、gnome-terminalの別のタブで次のことを行いました。
$ps aux | wc -l
192
ループの実行中に再実行しました。
$ps aux | wc -l
192
私の質問 -
whileループがPIDを取得できないのはなぜですか?
whileループ内で実行される各コマンドのPIDを取得するには?
答え1
while
外部コマンドではなくシェルキーワードなので、独自のPIDを取得できません。 PIDがプロセスとして一覧表示されますbash
。 PIDを取得するには、echo $$
内部while
ループを挿入してps aux | grep '[b]ash'
PIDを一致させるために使用します。コマンドがシェル組み込みでない場合は、たとえば、を使用して一般的な方法でPIDを取得できます
ps
。pgrep
PPID(親プロセスID)フィールドには、通常実行中のシェルのPIDが表示されます。例えば。
foobar
シェルループ内のコマンドの詳細を取得するには、次のようにします。ps -ef | grep '[f]oobar'
または
ps aux | grep '[f]oobar'
または
pgrep
:pgrep 'foobar'
複数のシェルプロセスが実行されるため、詳細を考慮し、PPIDフィールドがシェルPIDと一致することを確認する必要があります。
ループを実行する場合、プロセステーブル内のプロセスの可用性は、そのプロセスが実行された期間とプロセステーブルを確認するタイミングによって異なります。
答え2
while
echo
組み込みbashシェルコマンドなので、別途PIDはありません。このコマンドをsleep 1
コマンドリストに追加してみてください。これで新しいコマンドが表示されますps
。