![在文件和控制台中输出 stdOut/StdErr 的后台进程](https://linux22.com/image/1491938/%E5%9C%A8%E6%96%87%E4%BB%B6%E5%92%8C%E6%8E%A7%E5%88%B6%E5%8F%B0%E4%B8%AD%E8%BE%93%E5%87%BA%20stdOut%2FStdErr%20%E7%9A%84%E5%90%8E%E5%8F%B0%E8%BF%9B%E7%A8%8B.png)
我想通过 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 ...
等等。请注意,在这种情况下,消息会逐个交替,但情况可能并非总是如此。您可能希望启用行缓冲(就像我在示例程序中所做的那样),除非您不介意输出以“块”的形式到达。