将标准输出重定向到包含日志记录过程的pid的文件

时间:2010-10-04 12:16:53

标签: bash scripting command-line exec pid

我已经搜索了一段时间,但我无法找到答案或想出我自己的解决方案,所以我转向你们。我实际上问的第一个问题是:)

我想运行同一程序的多个实例,并将每个程序的标准输出重定向到包含相同进程'pid的文件,如:

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

我知道这种情况甚至还没有结束:P我用exec和$ PPID修改了但是无济于事。我的bash-fu很弱:|请帮帮我,指点我!谢谢!

2 个答案:

答案 0 :(得分:3)

这里的问题是由bash启动的每个新进程都会获得新的PID,您必须在启动它之前重定向该进程的输出。但是你无法分辨OS将为该过程分配什么PID。

此问题的解决方案不是启动新流程,而是使用exec替换现有bash流程。

这是一个例子。首先,我们编写一个打印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的命令行参数的新进程。

祝你好运!

答案 1 :(得分:2)

如果你有bash 3或更新,你可以组合子shell,exec和$ {BASHPID}

也就是说,用()创建一个子shell,然后设置重定向到&lt;子shell&gt; .log和exec my_program的pid,它应该替换子shell的进程映像,继承它的pid(等等)。

( exec my_program >${BASHPID}.log )