ここでの問題は、bash によって開始された新しいプロセスがそれぞれ新しい PID を取得し、プロセスを開始する前にそのプロセスの出力をリダイレクトする必要があることです。ただし、OS によってそのプロセスにどの PID が割り当てられるかはわかりません。
この問題の解決策は、新しいプロセスを開始するのではなく、既存の bash プロセスを を使用して新しいプロセスに置き換えることexec
です。
ここに例があります。まず、PID を出力する基本的な C プログラムを作成します。
// printpid.c
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
printf ("C process pid is %d\n", getpid());
return 0;
}
次に、PID を出力し、exec を使用してこのプログラムに置き換える単純な bash スクリプトを作成します。
#!/bin/bash
# printpid.sh
echo Bash process PID is $$
exec ./printpid > $$.log
printpid.sh
それでは、このスクリプトを複数回呼び出すスクリプトを書きましょう。
#!/bin/bash
# example.sh
./printpid.sh
./printpid.sh
./printpid.sh
それでは、動作することを確認しましょう。
$ ls
example.sh printpid printpid.c printpid.sh
$ ./example.sh
Bash process PID is 6397
Bash process PID is 6398
Bash process PID is 6399
$ ls
6397.log 6398.log 6399.log example.sh printpid printpid.c printpid.sh
$ cat 6397.log
C process pid is 6397
$ cat 6398.log
C process pid is 6398
$ cat 6399.log
C process pid is 6399
$
exec
を使用している場合は、bash シェルが のコマンド ライン引数として指定された新しいプロセスに自身を置き換えるため、スクリプトのその後に他のものを追加できないことに注意してくださいexec
。
ハッキング頑張って!