view stdout para outro pts [duplicado]

22

Aqui está a situação. Eu deixei meu pc em casa fazendo um rsync de um disco rígido de 2TB para outro disco rígido de 2TB (vai demorar um pouco, já que ambos são USB 2.0). Eu estou agora no trabalho e tenho ssh-ed em meu pc em casa. Se eu fizer ps aux | grep rsync , posso ver o seguinte:

1000  7214 18.8  0.1  30636  1368 pts/0 S+   00:52 134:00 rsync -vr /media/master /media/slave

No entanto, quero ver exatamente o que o rsync está fazendo. Quando eu estava em casa, a saída padrão era mostrada no meu terminal e o modo detalhado do rsync mostrava quais arquivos estavam sendo copiados. Existe alguma maneira de ler stdout para outros pts?

$ ps -t pts/0
7214 pts/0    02:14:42 rsync

Eu fiz um pouco de googling e parece que /proc/pid/fd pode ter a resposta, mas não tenho certeza sobre isso ...

P.S. Eu tenho privilégios de sudo, claro.

    
por mulllhausen 10.06.2011 / 05:22

5 respostas

19

Execute gdb -p 7214 e faça:

p dup2(open("/dev/pts/your-pts-number", 1), 1)
detach
quit

Isso não é exatamente óbvio, mas redireciona o stdout do processo que você anexou para o caminho dado na primeira linha (neste caso, seus pts desejados).

    
por 10.06.2011 / 05:52
9

A ferramenta strace permite que você obtenha uma cópia da saída para um descritor de arquivo específico (neste caso, stdout e stderr).

strace -e write=1,2 -e trace=write -p 7214

Isso aparecerá no formato de dump hexadecimal.

    
por 10.06.2011 / 05:55
6

Você pode desanexar o processo rsync de seu terminal e movê-lo para o atual. Veja Como posso deserdar um processo em execução e associá-lo a um novo shell de tela? . A abordagem fundamental é semelhante a o comando gdb na resposta de John Flatness , mas ferramentas como neercs e retty são mais robustos.

Certifique-se de importar o processo para uma sessão de tela ou tmux, para que você não precise separá-lo novamente (a menos que você use neercs, que já fornece essa funcionalidade).

Outra abordagem é verificar o que o processo está fazendo agora, analisando quais arquivos ele abriu. lsof mostrará a você isso.

lsof -p7214
    
por 11.06.2011 / 00:38
1

Se você sabe que vai querer fazer isso com antecedência ...

Crie uma sessão de script no seu computador doméstico (usando -f para liberar o buffer):

script -f output.txt
rsync -vr /media/master /media/slave

( Ctrl + D para terminar a sessão de script quando chegar em casa)

No trabalho, você pode acompanhar o output.txt:

tail -f output.txt
    
por 29.08.2014 / 07:31
0

No BSD, verifique o comando watch .

Caso contrário, por favor, verifique o seguinte exemplo usando strace (onde 7214 é seu PID):

strace -e trace=write -s1000 -fp 7214 2>&1 \
| grep --line-buffered -o '".\+[^"]"' \
| grep --line-buffered -o '[^"]\+[^"]' \
| while read -r line; do
  printf "%b" $line;
done

Para explicações adicionais ou mais exemplos, verifique: Como visualizar a saída de um processo em execução em outra sessão bash?

    
por 12.04.2016 / 00:18