
Vamos supor que eu tenha um processo que faz cálculos longos (por exemplo, está em execução há dias), ele usa um disco como armazenamento temporário para armazenar resultados intermediários (por exemplo montado em /mnt
e quero substituir /dev/sda1
por /dev/sdb1
). Como posso substituir esse disco por outro disco sem interromper esse processo e sem perturbá-lo demais?
Essa é uma questão geral que não estou pensando em um programa específico. Digamos que rodamos uma versão recente do Linux.
Responder1
Se o processo estiver usando algum diretório para criar e excluir arquivos temporários, você provavelmente poderá tentar interrompê-lo com kill -STOP $pid
o comando 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 o kill -CONT $pid
.
Se ainda houver algum arquivo aberto ou o processo não fechar, você pode tentar migrar descritores de arquivo usando GDB. Tentei fazer isso manualmente e funcionou, mas encontrei um script que pode fazer isso por você:http://ingvar.blog.redpill-linpro.com/2010/07/10/mudar-a-process-file-descriptor-on-the-fly/
Tenha cuidado se o processo estiver se comunicando pela rede, quando você interrompê-lo, as conexões podem atingir o tempo limite, então você precisa fazer isso o mais rápido possível (provavelmente teste a sequência de comandos no processo fictício antes e execute-o em lote)
Embora eu ache que funcionaria, prefiroNão recomendadovocê faça isso no ambiente de produção.
EDIT: Você também pode ver os soquetes de rede abertos em /proc/$pid/fd para determinar se o processo está usando a rede ou não.
Responder2
Isso depende inteiramente do comportamento do seu processo ao usar o armazenamento temporário.
Se o seu processo mantiver um arquivo aberto em /mnt
, você não poderá substituir o dispositivo sem fazer com que o processo provavelmente falhe de alguma forma indefinida, mesmo se você conseguir desmontar o dispositivo à força. Os processos geralmente não esperam que os dispositivos nos quais possuem arquivos abertos desapareçam.
Se o seu processo abrir, gravar e fechar arquivos em /mnt
, você poderá conseguir interrompê-lo, desmontar e remontar /mnt
e reiniciá-lo. Isso depende de você ser capaz de interromper o processo enquanto ele não estiver em uso /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ê interromper o processo sem nenhum arquivo aberto /mnt
, porque você pode ter interrompido alguma lógica que depende de /mnt
não ser alterada; algo como
- Verifique se
/mnt/wibble
existe - É verdade! Vamos nos preparar para abrir e ler
- ...o processo é interrompido e um dispositivo diferente é montado em
/mnt
... - ...o processo é reiniciado...
- Oh não!
/mnt/wibble
não pode ser aberto! - Morrer horrivelmente
Responder3
Qualquer programa que faça cálculos que durem dias deve ser projetado para enviar estado suficiente ao disco periodicamente. Se a reinicialização do processo significar a perda de uma hora de processamento, isso pode ser bom, mas se você perder mais do que isso, eu chamaria esse programa de mal projetado.
Dito isto, pode haver outros cenários em que você deseja manter um processo ativo por mais tempo e poder substituir um disco abaixo dele. Para essas situações, você deve desacoplar o sistema de arquivos da mídia física.
As opções possíveis incluem:
- Usar invasão de software
- Use outra camada de dispositivo de bloco virtual (talvez o LVM seja adequado)
- Use um sistema de arquivos, que pode usar vários dispositivos subjacentes