Monitorando remotamente o status do DD

0

Eu tenho um longo ddprocesso em execução em um sistema Debian a partir do console local.

Sei que posso enviar USER1 ou CTRL+Tno console local, mas o meu único meio é monitorá-lo por enquanto ssh. Infelizmente, o Google foi inútil aqui.

Existe uma maneira simples de monitorar seu progresso remotamente sem interromper a tarefa atual?

Unkwntech
fonte
11
Confira a resposta nesta sessão de perguntas e respostas .. kill -USR1não precisa ser executada em um terminal local, apenas precisa ser executável com as permissões corretas (ou seja, você pode precisar sudo kill) .. isso não funcionou ou você não pode abrir uma segunda instância SSH para monitorar?
Txtechhelp
Nota: É relatado que você precisa usar kill -INFO $(pgrep ^dd$)em sistemas BSD (como o OSX). porque dessa maneira interrompe o dd no OSX. de dois comentários desse post para usuários do BSD ...
Hastur 26/02
Que tal enviar o comando via ssh? Algo como ssh 'kill -USR1 $(pgrep ^dd)' ? Obviamente, somente quando você souber que kill -usr1isso não interromperá a execução do seu comando.
Hastur 26/02
11
Quando você envia USR1, o DD imprime o progresso atual no console em que foi iniciado, e não no de onde foi enviado.
Unkwntech 26/02
Você pode confirmar se acabou de lançar o comando e se acabou de sair do local onde está aberto o console?
Hastur

Respostas:

0

Agora que o ddcomando long está em execução, é tarde para redirecionar sua saída. Talvez você esteja longe do console e não possa usar screenou criar um FIFO para seu stderr ...

... mas você ainda pode usar duas sessões ssh e strace!

Na primeira sessão ssh você pode escrever

sudo strace -ewrite -p `pgrep ^dd`  2>&1 | grep -v "write(1,"

No segundo lugar ( leia a nota de aviso abaixo para o sinal usar -SIGUSR1ou SIGINFO)

kill -USR1 $(pgrep ^dd)

E leia uma saída não tão agradável da primeira semelhante à abaixo

Process 26176 attached
--- SIGUSR1 {si_signo=SIGUSR1, si_code=SI_USER, si_pid=29517, si_uid=0} ---
write(2, "329094980+0 records in\n329094979"..., 47) = 47
write(2, "168496629248 bytes (168 GB) copi"..., 34) = 34
write(2, ", 109.221 s, 1.5 GB/s\n", 22) = 22

Nota: Infelizmente (mesmo que relatado de maneira diferente), o comando kill -USR1 $(pgrep ^dd)forçará os ddprocessos em execução a gravar no stderr original . Para isso, foi necessário modificar a resposta original (você pode ver no histórico da versão).
Aviso: Conforme relatado nesta outra resposta, o sinal para enviar com kill em vez de -USR1pode depender da distribuição Linux. No OpenBSD -SIGINFOno Ubuntu SIGUSR1. Verifique cuidadosamente com antecedência que alguém errado pode encerrar o processo!

Hastur
fonte
Infelizmente, isso não é uma solução, pois quando o DD recebe o sinal USR1, ele relata seu progresso no console em que foi executado.
Unkwntech
@Unkwntech Nesse caso, você pode usá screen-lo e recuperá -lo com o ssh. Caso -usr1 contrário, desde que li que "faz com que as estatísticas de E / S sejam impressas com erro padrão" , você pode usar um Named Pipe para redirecionar o stderr do seu comando e ler a partir dele quando desejar e depois enviar o -usr1sinal.
Hastur 26/02
0

Com pv

pvpode assistir outro processo. A parte relevante de man 1 pv:

-d PID[:FD], --watchfd PID[:FD]

Em vez de transferir dados, observe o descritor FDde arquivo do processo PIDe mostre seu progresso. O pvprocesso será encerrado quando FDmudar para um arquivo diferente, alterar o modo de leitura / gravação ou for fechado; outros modificadores de transferência de dados - e controle remoto - não podem ser usados ​​com esta opção.

Se apenas um PIDfor especificado, esse processo será monitorado e todos os arquivos e dispositivos de bloco regulares que abrir serão mostrados com uma barra de progresso. O pvprocesso será encerrado quando o processo terminar PID.

Existem restrições, porém:

  • Isso funciona apenas para arquivos regulares e dispositivos de bloco. Se você ddestiver no meio de um pipeline, pv -dnão assistirá ao stdin ou stdout. Barra de progresso não faz sentido, neste caso, você ainda pode querer ver a taxa de transferência. Mas mesmo se você especificar explicitamente PID:0ou PID:1, isso não funcionará.
  • Normalmente, como usuário comum, você não pode assistir a processos de outro usuário.

A vantagem é que essa abordagem é totalmente não intrusiva. Não deve afetar a corrida de ddforma alguma.


Com reptyr

Outra abordagem é com reptyr; veja esta resposta minha .

Inicie screenou tmuxuse reptyrpara conectar a corrida ddao novo terminal. Se isso der certo, você poderá ver dda reação dos sinais no novo terminal. Desconecte de screen/ tmuxe reconecte se necessário.

Notas:

  • ddA reação dos sinais não aparecerá mais no terminal antigo.
  • reptyrredirecionará os descritores de arquivos relevantes e alterará o terminal de controle de dd; então isso é intrusivo de certa forma. Meu conselho é tentar fazer isso com um " macaco arranhado dd " primeiro.
  • Em alguns casos (por exemplo, ddem um pipeline) reptyrnão é possível conectar. Então reptyr -Tpode funcionar, mas afetará outros processos, não apenas dd. Por favor, veja man 1 reptyrpara detalhes.
Kamil Maciorowski
fonte