3

しばらく検索しましたが、答えが見つからないか、自分で解決策を思いつくことができないので、皆さんに頼ります。私が実際にここで尋ねる最初の質問:)

同じプログラムのいくつかのインスタンスを実行し、これらの各プログラムの標準出力を、同じプロセスの pid を含むファイルにリダイレクトしたいと考えています。

my_program > <pid of the instance of my_program that is called in this command>.log

PI は exec と $PPID をいじくり回しましたが、役に立ちませんでした。私の bash-fu は弱いです :| 助けてください、どこか教えてください!ありがとう!

4

2 に答える 2

3

ここでの問題は、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

ハッキング頑張って!

于 2010-10-04T14:02:57.533 に答える
2

bash 3 以降を使用している場合は、サブシェル、exec、および ${BASHPID} を組み合わせることができます

つまり、( ) でサブシェルを作成し、<pid of subshel​​l>.log へのリダイレクトを設定し、my_program を実行します。これにより、サブシェルのプロセス イメージが置き換えられ、pid が継承されます (とりわけ)。

( exec my_program >${BASHPID}.log )

于 2010-10-04T14:49:01.030 に答える