Que riscos existem para parar e retomar processos no Linux?

1

Digamos que eu pare um processo usando Ctrl+Z e o reinicie cinco horas depois usando fg . Quão arriscado é isso em relação ao bom funcionamento do processo?

Por exemplo, imagine que vim está trabalhando na gravação de um arquivo grande no disco e que eu paro durante a gravação. Será que vim terminará de escrever o arquivo quando eu reiniciá-lo, sem problemas? Como situação extrema, o que acontece se eu deletar o arquivo nesse meio tempo? Posso acabar corrompendo o sistema de arquivos? (A exclusão de um arquivo que o% parado vim estava gravando para o possível, ou os drivers do sistema de arquivos me impedirão de excluir o arquivo até que vim termine de gravar nele?)

vim é obviamente um software relativamente simples, sendo "meramente" um editor de texto. Posso parar e retomar peças complexas de software, como apache ou X11 , sem esperar muitos problemas (além do tempo limite dos clientes, no caso do Apache)?

    
por haroba 30.05.2014 / 01:17

3 respostas

6

Essencialmente, Ctrl-Z não é uma coisa perigosa para fazer. Você não deveria ter medo disso.

O que exatamente vai acontecer depende do que o processo está fazendo. Seus exemplos são bons para considerar.

O primeiro, com o vim escrevendo um arquivo ... nada de ruim vai acontecer. Se ainda houver espaço em disco quando você reiniciar o vim, ele terminará de gravar o arquivo. Se você matar o vim enquanto ele estiver suspenso, o arquivo será truncado com o máximo de dados que foram gravados antes de ser suspenso (pelo menos até onde você precisa se preocupar). Se você excluir o arquivo enquanto o vim estiver suspenso, essencialmente o vim continuará a ver o arquivo enquanto ele precisar dele. De fora do vim, o arquivo será visto como deletado, mas o vim ainda irá vê-lo até terminar de escrevê-lo, e o fechará, ponto em que ele desaparecerá. (Se o vim tentar reabri-lo, ele desaparecerá.) Depois de estar acostumado a esse último comportamento, você sentirá que está usando um brinquedo bobo quando o Windows bloqueia arquivos.

Seu segundo exemplo pode causar problemas. Se houver outros processos interagindo com os seus, eles ficarão um pouco presos neste aplicativo. Então, sim, os tempos limite do cliente ocorrerão, alguns processos podem bloquear indefinidamente esperando para ler dados, etc. Mas ainda nada realmente "ruim" vai acontecer. Nada que deva danificar o sistema, a menos que haja algum bug em algum lugar. (Por exemplo, um aplicativo mal escrito que não consegue lidar com o tempo limite simplesmente desiste e perde todos os seus dados ... mas isso não é culpa do aplicativo que você suspendeu.)

O Apache deixaria de exibir páginas da Web, obviamente. O X11 iria parar de empurrar os pixels ao redor. Mas, geralmente, quando você inicia o backup novamente, as coisas que estavam bloqueando serão retomadas e, se os clientes tiverem expirado, se você reiniciá-las, elas também funcionarão bem novamente.

    
por 30.05.2014 / 01:34
1

O Unix é um sistema operacional de compartilhamento de tempo, portanto, os programas não têm acesso exclusivo à CPU, eles compartilham com outros programas e com o próprio sistema operacional. Quando você suspende um programa, você só está atrasando o tempo até o próximo período de execução. Dependendo do programa, ou seja, se é sensível ao tempo, como o software de reprodução de rede ou vídeo, você pode obter tempos limite, mas nada de ruim acontece basicamente.

Quanto à segunda pergunta sobre a exclusão de um arquivo enquanto o programa ainda está "em execução", veja a pergunta "Quando o rm remove o arquivo aberto arquivos? ".

    
por 30.05.2014 / 01:42
-1

Basicamente, isso depende do programa. Com o vim (1) (ou com o vi (1) ) você pode até matá-lo, que você terá a possibilidade de recuperar o arquivo até o momento do kill sem perder dados, mesmo se todo o sistema tiver falhado (veja a página do manual vi (1) / vim (1) )

Em geral, interromper um programa por cinco horas pode ter alguns efeitos laterais que podem corromper o que você estiver fazendo.

Suponha que o programa que você abriu é um cliente de rede (por exemplo, uma sessão ssh (1) para outra máquina). Normalmente, os servidores ativam uma opção TCP chamada SO_KEEPALIVE permita manter a conexão viva mesmo se você não tiver nada a dizer. Neste caso, não faz mal, já que o kernel, tendo uma conexão TCP aberta, torna o KEEPALIVE em nome do processo interrompido (as conexões tcp são recursos do kernel, não recursos do processo da área do usuário) e você pode manter o processo parado indefinidamente.

Mas o que acontece se o servidor está tentando enviar alguns dados e o cliente não o reconhece. Talvez o protocolo do aplicativo tenha um tempo limite para descartar uma conexão se o cliente não disser nada por um longo período de tempo (ou o servidor preencher todo o buffer de dados para o cliente e não puder bloqueá-lo). Nesse caso, você obterá um cliente tentando usar uma conexão que caiu há algum tempo (o servidor foi embora).

Portanto, a resposta a esta pergunta é: Em geral, não há problema, mas depende exatamente do que o programa parou de precisar de seu ambiente (ele dorme, mas o mundo continua a girar)

    
por 24.09.2014 / 20:01