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,并且您必须在启动之前重定向该进程的输出。但是您无法确定操作系统将为该进程分配什么 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;
}

然后我们编写一个简单的 bash 脚本,它将打印其 PID 并使用 exec 将其替换为该程序:

#!/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 shell 会用指定为命令行参数的新进程替换自身exec

祝黑客好运!

于 2010-10-04T14:02:57.533 回答
2

如果你有 bash 3 或更新的版本,你可以结合 subshel​​ls、exec 和 ${BASHPID}

也就是说,使用 ( ) 创建一个子 shell,然后设置重定向到 <pid of subshel​​l>.log 并执行 my_program,这应该替换子 shell 的进程映像,继承它的 pid(除其他外)。

( exec my_program >${BASHPID}.log )

于 2010-10-04T14:49:01.030 回答