Processo em segundo plano com saída stdOut / StdErr em arquivos e console

0

Eu quero SSH em uma máquina, iniciar um processo, gravar o stdErr e stdOut do processo em dois arquivos separados ao ler o stdOut / stdErr no console. Assim que algumas linhas específicas foram escritas no stdOut / stdErr (do console), quero desconectar a sessão SSH, mantendo o processo em execução em segundo plano.

No momento estou usando o nohup para iniciar o processo em segundo plano, registre o stdout e o stderr em um arquivo e retorne o pid do processo iniciado. O que está faltando é a parte em que eu ainda posso obter o stdOut / stdErr do console, até que eu decida que quero desconectar a sessão SSH, enquanto deixo o processo rodar em segundo plano.

Aqui está um exemplo simples com um script de 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
    
por Ojo 01.05.2016 / 18:46

1 resposta

0

tail faz o que você deseja. Você precisa de dois recursos de tail para fazer com que funcione no seu caso. A primeira é que tail permite que você 'siga' (continue assistindo) o conteúdo do arquivo à medida que os arquivos crescem: (a partir do manpage)

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

O segundo recurso é que tail aceita vários arquivos, mesmo quando usa -f .

Eu testei com o seguinte programa em 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;
}

Saída:

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

e assim por diante. Observe que as mensagens alternam bem uma a uma neste caso, mas isso pode nem sempre ser verdade. Você provavelmente deseja habilitar o buffer de linha (como eu fiz no programa de exemplo), a menos que você não se importe com a saída que chega em 'chunks'.

    
por 03.05.2016 / 09:32