Я хочу подключить SSH к машине, запустить процесс, записать stdErr и stdOut процесса в два отдельных файла, одновременно читая stdOut/stdErr в консоли. Как только некоторые конкретные строки были записаны в stdOut/stdErr (консоли), я хочу отключить сеанс SSH, сохраняя при этом процесс в фоновом режиме.

На данный момент я использую nohup для запуска процесса в фоновом режиме, записываю stdout и stderr в файл и возвращаю pid запущенного процесса. Чего не хватает, так это части, где я все еще могу получить stdOut/stdErr из консоли, пока не решу, что хочу отключить сеанс SSH, позволяя процессу работать в фоновом режиме.

Вот простой пример со скриптом ping

test.sh:

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

ping.sh:

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

1 ответ1

0

tail делает то, что вы хотите. Вам нужно две особенности tail , чтобы он работал в вашем случае. Первый - это то, что tail позволяет вам «следить» (продолжать наблюдать) за содержимым файлов по мере их роста: (из man-страницы)

-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 ...

и так далее. Обратите внимание, что в этом случае сообщения чередуются одно за другим, но это не всегда может быть правдой. Возможно, вы захотите включить буферизацию строки (как я делал в примере программы), если вы не возражаете против вывода, поступающего в виде «кусков».

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .