Фоновый процесс с выводом stdOut/StdErr в файлах и консоли

Я хочу 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
18
задан Ojo
19.02.2023 3:15 Количество просмотров материала 3632
Распечатать страницу

1 ответ

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

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

0
отвечен Edward 2023-02-20 11:03

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх