在文件和控制台中输出 stdOut/StdErr 的后台进程

在文件和控制台中输出 stdOut/StdErr 的后台进程

我想通过 SSH 进入一台机器,启动一个进程,将进程的 stdErr 和 stdOut 写入两个单独的文件,同时读取控制台中的 stdOut/stdErr。一旦在(控制台的)stdOut/stdErr 中写入一些特定的行,我想断开 SSH 会话,同时保持进程在后台运行。

目前,我正在使用 nohup 在后台启动进程,将 stdout 和 stderr 记录到文件中并返回已启动进程的 pid。缺少的是我仍然可以从控制台获取 stdOut/stdErr 的部分,直到我决定要断开 SSH 会话,同时让进程在后台运行。

这是一个带有 ping 脚本的简单示例

测试.sh:

#!bin/bash
nohup bash ~/ping.sh > foo.out 2> foo.err & echo $!

ping.sh:

#!bin/bash
/bin/ping -c 8 superuser.com

答案1

tail满足您的需求。您需要两个功能tail才能使其适合您的情况。第一个功能允许tail您在文件增长时“跟踪”(持续观察)文件内容:(摘自手册页)

-f, --follow[={name|descriptor}]
    output appended data as the file grows; -f, --follow, and
        --follow=descriptor are equivalent

第二个特点是tail接受多个文件,即使使用-f

我使用以下 C 程序对其进行了测试:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
    int i;
    setlinebuf(stdout);
    setlinebuf(stderr);
    for (i = 0; i < 10; i++) {
        fprintf(stdout, "message on stdout ...\n");
        sleep(1);
        fprintf(stderr, "message on stderr ...\n");
        sleep(1);
    }
    return 0;
}

输出:

$ nohup ./prog > foo.out 2> foo.err & echo $!
9778
$ tail -f foo.out foo.err
==> foo.out <==
message on stdout ...

==> foo.err <==
message on stderr ...

==> foo.out <==
message on stdout ...

==> foo.err <==
message on stderr ...

==> foo.out <==
message on stdout ...

等等。请注意,在这种情况下,消息会逐个交替,但情况可能并非总是如此。您可能希望启用行缓冲(就像我在示例程序中所做的那样),除非您不介意输出以“块”的形式到达。

相关内容