Como posso redirecionar o stdout / stderr de um processo já em execução?

7

(rodando em um servidor Ubuntu 10.04 64 bits)

Ontem, cometi o erro de iniciar um processo (que eu não sabia que levaria vários dias para executar) sobre o SSH sem usar a tela. Eu passei o dia todo tentando descobrir de alguma forma que eu posso extrair a saída do processo do aperto de ferro do SSH para que eu possa reinicializar minha máquina cliente, mas não estou chegando a lugar nenhum.

Eu tentei usar o gdb e seguir as instruções na parte inferior da página , mas quando executo o primeiro gdb comando para criar um arquivo, recebo uma mensagem de erro informando No symbol table is loaded. Use the "file" command. De que eu recolhi, isso significa que eu tenho que recompilar o programa cuja saída eu estou tentando redirecionar, o que obviamente não é absolutamente nenhuma ajuda para mim agora que é já em execução.

Também achei que poderia usar o retty para redirecionar a saída para outro terminal, mas evidentemente ele não é compilado em plataformas de 64 bits.

Como posso redirecionar a saída deste processo para outro terminal ou para um arquivo?

    
por nonoitall 16.12.2010 / 02:48

3 respostas

5

Parece que as instruções dadas para gdb estão incorretas e incompletas de várias maneiras.

Primeiro, você precisa usar

gdb [executablefile] [pid]

para que o GDB saiba o que o programa está conectando na verdade é . Acabei de testar isso e ele pode usar um executável despojado. Observe que, enquanto o gdb estiver anexado ao processo, o processo será suspenso. Se esse processo estiver se comunicando por uma rede, digite rapidamente ou a conexão de rede provavelmente expirará.

Em segundo lugar, os comandos fornecidos não explicam o que estão fazendo, e a instrução que você deve digitar "para um diretório no qual deseja que o seu programa grave arquivos" está errada, já que O gdb está pedindo ao programa original para executar a função creat() . O exemplo fornecido criará os arquivos myprog.stderr e myprog.stdout no diretório de trabalho atual do programa em execução, não no diretório em que você executou o gdb. Use nomes de caminhos absolutos aqui se você não souber qual é o CWD do programa (ou veja ls -l /proc/[pid]/cwd ).

Em terceiro lugar, com a falta de explicação, é importante saber que o primeiro parâmetro para dup2() é o número do descritor de arquivo retornado pelo creat() anterior, portanto, se esse programa em execução tiver vários arquivos abertos, você pode acabar uma troca como

(gdb) call creat("/home/me/myprog.stdout",0600)
$1 = 7
(gdb) call dup2(7,1)
$2 = 1
(gdb) call creat("/home/me/myprog.stderr",0600)
$3 = 8
(gdb) call dup2(8,2)
$4 = 2

Quando você sair do gdb, ele perguntará se você deseja "sair de qualquer maneira (e desconectá-lo)". A resposta é sim.

Por fim, bg e disown são bash builtins. Se você não estava usando bash, então você está por conta própria a partir daqui. bg move um trabalho suspenso para o segundo plano como se ele fosse iniciado usando somecommand & , e disown remove o programa da lista de programas ativos do bash para SIGHUP quando o bash sai.

    
por 16.12.2010 / 06:21
0

Você não pode fazer nada remotamente. Faça o login no outro servidor usando ssh e a mesma conta que foi usada para iniciar o processo. Você poderá controlar o processo a partir da nova sessão.

    
por 16.12.2010 / 03:21
0

Você pode usar o rirectirect ( link ).

Digite

reredirect -m FILE PID

e as saídas (padrão e erro) serão gravadas em FILE.

reredirect README também explica como restaurar o estado original do processo, como redirecionar para outro comando ou redirecionar somente stdout ou stderr.

    
por 14.10.2014 / 16:33