このスクリプト
$ cat csub.sh
#!/bin/bash
while true;
do
sleep 5
AVAR=$(date; sleep 2)
done
起動時にプロセスがps出力に表示されるようにします。
ps -eLf|egrep '[c]sub.sh|PID'
UID PID PPID LWP C NLWP STIME TTY TIME CMD
jimmy 31364 23445 31364 0 1 00:33 pts/7 00:00:00 /bin/bash ./csub.sh
これは完全に予測可能であり、$(date; sleep 2)
実際に異なるプロセスを生成します。
驚くべきことに、生成されたプロセスは次のとおりです。まったく同じ表示コマンド
UID PID PPID LWP C NLWP STIME TTY TIME CMD
jimmy 31364 23445 31364 0 1 00:33 pts/7 00:00:00 /bin/bash ./csub.sh
jimmy 31433 31364 31433 0 1 00:33 pts/7 00:00:00 /bin/bash ./csub.sh
ps出力にプロセスをキャプチャできるように省電力モードを追加しました。そうでなければ短すぎるので、機会ははるかに減るでしょう。ご覧のように、生成されたプロセス31433は親プロセスとして31364を持ちます。生成されたプロセスに、日付やスリープコマンドなど、処理する内容に言及する他のCMDがあることを願っています。複数のコマンド置換がある場合、生成されたプロセスが表示されることをどのように区別できますか?
答え1
マニュアルページのパート2からfork()
:
fork()
呼び出しプロセスをコピーして新しいプロセスを作成します。新しいプロセス(サブプロセスと呼ばれる)は、以下を除いて呼び出しプロセス(親プロセスと呼ばれる)と同じです。
- 子プロセスには一意のプロセスIDがあり、そのPIDは既存のプロセスグループ()のIDと一致しません
setpgid(2)
。- 子プロセスの親プロセスIDは、親プロセスIDと同じです。
- 子プロセスは親のメモリロック(
mlock(2)
、、mlockall(2)
)を継承しません。- 子プロセスのプロセスリソース使用率(
getrusage(2)
)とCPU時間カウンタ()times(2)
は0にリセットされます。- 子の保留中の信号セットは最初は空です(
sigpending(2)
)。semop(2)
子項目は親項目()からセマフォ調整を継承しません。fcntl(2)
子項目は親項目()からレコードロックを継承しません。setitimer(2)
子は親(、、、alarm(2)
)からtimer_create(2)
タイマーを継承しません。aio_read(3)
子項目は、親項目から処理されていない非同期I / O操作(、)を継承せず、親項目aio_write(3)
から非同期I / Oコンテキストも継承しません(参照io_setup(2)
)。
プロセスの呼び出しコマンドラインはこのリストにないため、親プロセスと同じです。子プロセスのPPID(親プロセスPID)が元のプロセスのPIDになるため、子プロセスと親プロセスを区別できます。