基本的なコマンドを実行していると考えてください。
ls
上記のコマンドは、実行されたときにpidを持っているでしょうか?はいの場合、どうすればそのpidを判別できますか?
やってみると
echo $!
lsコマンドの直後に、空の出力を返します。
一方、私が実行した場合
ls &
その後
echo $!
これで、lsコマンドのpidが表示されます。
実際、以下の監査済みログを見ているときにこの質問がありました。
type=USER_CMD msg=audit(12/16/2014 17:15:36.201:68342) : user pid=19247 uid=enginst auid=enginst ses=4229 msg='cwd=/apps/oradump/ora_temp_rdbms/OH3 cmd=chmod -R 777 11203 terminal=pts/2 res=success'
type=USER_CMD msg=audit(12/16/2014 17:36:33.968:68753) : user pid=1801 uid=enginst auid=enginst ses=4229 msg='cwd=/apps/Oracle/RDBMS cmd=chmod -R 777 11203 terminal=pts/2 res=success'
ここで、上記のログは、「chmod -R 777」がユーザーenginstによって実行されたことを示しており、pidもあります。
さて、auditdログにはppid(親プロセスID)が表示されないため、chmodコマンドがユーザーによって明示的に実行されたと結論付けることができますか?これは、スクリプト/プログラムが開始した場合に当てはまりますか?
ただし、上記を確認するためにプロセスアカウンティングをオンにしました。しかし、どちらにしても、私の質問は成り立ちます。
chmod、lsのようなコマンドは、実行されるとpidを取得しますか?またはいいえ?または、フォアグラウンドではなく、バックグラウンドで実行するとpidを取得しますか?
すべての外部コマンドとすべてのサブシェルには独自のPIDがあります。シェルビルトインにはありません。
終了したばかりの同期コマンドのPIDを提供する機能を私は知りません。もちろん、次の方法ですべてのコマンドを実行できます。
command & pid=$!; fg