【问题标题】:Redirecting standard output to a file containing the pid of the logging process将标准输出重定向到包含日志记录进程的 pid 的文件
【发布时间】:2011-04-20 18:50:59
【问题描述】:

我已经搜索了一段时间,但我找不到答案或想出我自己的解决方案,所以我求助于你们。我实际上在这里问的第一个问题:)

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

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

我知道这甚至还没有接近:P 我已经修改了 exec 和 $PPID 但无济于事。我的 bash-fu 很弱 :|请帮助我,指出我的地方!谢谢!

【问题讨论】:

    标签: bash scripting command-line exec pid


    【解决方案1】:

    这里的问题是 bash 启动的每个新进程都会获得新的 PID,并且您必须在启动之前重定向该进程的输出。但是你无法知道操作系统会为该进程分配什么 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 的命令行参数的新进程替换自己。

    祝你好运!

    【讨论】:

    • 如何为我想要后台处理的进程执行此操作?我想将我的后台进程的输出重定向到一个名为该进程的 PID 的文件中。 exec bash -c "sleep 10; echo hi" &gt; ~/tmp/$$ 2&gt;&amp;1 &amp; disown $!
    【解决方案2】:

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

    也就是说,用 ( ) 创建一个子shell,然后设置重定向到 .log 并执行 my_program,这应该替换子shell 的进程映像,继承它的 pid(以及其他内容)。

    ( exec my_program >${BASHPID}.log )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-19
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      相关资源
      最近更新 更多