Altera o disco usado por um processo de longa execução

1
Vamos supor que eu tenha um processo que faça cálculos longos (por exemplo, está sendo executado há dias), ele usa um disco como armazenamento temporário para armazenar resultados intermediários (por exemplo, montado em /mnt e eu quero substituir /dev/sda1 por% código%). Como posso substituir esse disco por outro disco sem matar esse processo e sem perturbá-lo demais?

Essa é uma pergunta geral que não estou pensando em um programa específico. Digamos que corremos uma versão recente do linux.

    
por piec 09.04.2014 / 14:46

3 respostas

1

Se o processo estiver usando algum diretório para criar e excluir arquivos temporários, você provavelmente poderá tentar pará-lo com o comando kill -STOP $pid e dar uma olhada em / proc / $ pid / fd para descritores de arquivos abertos.

Se não houver nenhum aberto, você pode alterar com segurança o local de montagem, copiar seus arquivos e continuar trabalhando com kill -CONT $pid .

Se ainda houver arquivos abertos ou não fechados, tente migrar os descritores de arquivos usando o GDB. Eu tentei isso com a mão e funcionou, mas eu encontrei alguns scripts que podem fazer isso para você:

Tenha cuidado se o processo estiver se comunicando pela rede, quando você pará-lo, as conexões podem expirar, então você precisa fazê-lo o mais rápido possível (provavelmente testar a sequência de comandos no processo fictício antes e executá-lo como lote)

Embora eu ache que funcionaria, prefiro que não recomende que você faça isso no ambiente de produção.

EDIT: Você pode ver os sockets de rede abertos em / proc / $ pid / fd, assim você pode determinar se o processo está usando a rede ou não.

    
por 09.04.2014 / 15:58
1

Isso depende inteiramente do comportamento do seu processo ao usar o armazenamento temporário.

Se o processo contiver um arquivo aberto em /mnt , você não poderá substituir o dispositivo sem causar uma falha muito provável no processo, mesmo que consiga forçar a desmontagem do dispositivo. Os processos geralmente não esperam que os dispositivos nos quais eles têm arquivos abertos desapareçam.

Se o seu processo abrir, gravar e, em seguida, fechar arquivos em /mnt , talvez você consiga pará-lo, desmontar e remontar /mnt e reiniciá-lo. Isso depende de você poder interromper o processo enquanto não estiver usando /mnt . Então você poderia

$ kill -STOP pid
$ lsof -p pid | grep /mnt
... then, if it has nothing open on /mnt ...
$ sudo umount /mnt
$ sudo mount /dev/sdb1 /mnt
$ kill -CONT pid

Isso não funcionará necessariamente mesmo se você parar o processo sem arquivos abertos em /mnt , porque você pode ter interrompido alguma lógica que depende de /mnt não mudar; algo como

  • Verifique se /mnt/wibble existe
  • Faz! Vamos nos preparar para abrir e ler a partir dele
  • ... o processo é interrompido e um dispositivo diferente é montado em /mnt ...
  • ... processo reinicia ...
  • Oh não! /mnt/wibble não pode ser aberto!
  • Morrer horrivelmente
por 09.04.2014 / 14:56
1

Qualquer programa que faça cálculos que duram dias deve ser projetado para comprometer estado em disco periodicamente. Se uma reinicialização do processo significa que você perde uma hora de processamento, isso pode ser bom, mas se você perder mais do que isso, eu chamaria esse programa mal projetado.

Dito isso, pode haver outros cenários, em que você deseja manter um processo ativo por mais tempo e poder substituir um disco por baixo dele. Para essas situações, você deve investigar o desacoplamento do sistema de arquivos da mídia física.

As possíveis opções incluem:

  1. Usar invasão de software
  2. Use outra camada de dispositivo de bloco virtual (talvez o LVM seja adequado)
  3. Use um sistema de arquivos, que pode usar vários dispositivos subjacentes
por 09.04.2014 / 16:10