No linux, o que aconteceria com um programa em execução quando seu arquivo executável fosse modificado ou excluído?


12

Digamos que /usr/local/bin/rubyestá sendo executado em segundo plano e, em seguida, substituímos rubypor uma versão diferente, ou até excluímos ruby.

O que acontecerá com aqueles que executam processos ruby?

Respostas:


10

Depende exatamente de como o executável é atualizado. Se o mesmo arquivo for aberto e partes dele forem alteradas, coisas ruins acontecerão. Se ele for removido, o arquivo será removido da estrutura de diretórios do sistema de arquivos, mas na verdade não será desvinculado (ou seja, excluído) até que o último processo que o abra tenha sido executado. Portanto, se o executável for removido e um novo com o mesmo nome escrito em seu lugar, o antigo deverá continuar funcionando.


"Se o mesmo arquivo for aberto e partes dele forem alteradas" não será igual a "se o executável for removido e um novo com o mesmo nome escrito em seu lugar" ?? Você quis dizer mv novo arquivo para arquivo antigo é ruim, mas rm arquivo antigo e cp novo arquivo para arquivo antigo está ok?
jean

4

Eles vão continuar. Talvez caia horrivelmente se tentarem acessar a si mesmos e receber algo totalmente errado. Eu não faria isso a menos que eu tivesse que :)


Sim. Eu atualizo manualmente o software o tempo todo enquanto os scripts estão em execução.
John T

11
Para scripts, é importante ter intérpretes recentes recentes que funcionem com o descritor de arquivo aberto inicialmente. Nesse caso, não há problema, desde que você substitua o arquivo e não o altere. Para binários, normalmente eles trabalham no FD mapeado inicialmente, portanto não há problema (a menos que você modifique os arquivos). Mas pode haver aplicativos que abrem o nome do arquivo para inspeção e isso pode ser arriscado (no entanto, não posso dar nenhum exemplo negativo). A maioria das distribuições / gerenciadores de pacotes Linux trabalha sob a suposição de que substituir binários e bibliotecas (por tempo limitado) é bom.
Eckes

1

O que acontecerá com aqueles que executam processos ruby?

  1. faça uma cópia de / usr / local / bin / ruby
  2. [se não estiver em execução, execute / usr / local / bin / ruby]
  3. tente: rm / usr / local / bin / ruby
  4. e veja por si mesmo :)

1

Entendo que o kernel do Linux tenha um componente chamado loader que abre o próprio arquivo executável, contendo a imagem, durante o processo de carregamento / vinculação e, uma vez concluído o vínculo com as bibliotecas etc., o loader fecha o arquivo. Assim, esse processo acontece e é concluído quando o kernel realmente inicia o processo.

Não tenho certeza se o executável original no disco precisa ser referenciado se o executável mais tarde tentar importar bibliotecas externas.

Eu diria, e tem sido minha experiência que, se você excluir o executável no disco, o executável carregado na memória não será afetado. Da mesma forma, se o arquivo executável for substituído por uma versão mais recente, as atualmente em execução não serão "automaticamente" atualizadas, a menos que sejam interrompidas e reiniciadas.

Tive problemas com um controlador RAID que fez com que todo o disco em que o diretório raiz e outras partições estivesse montado agisse repentinamente como se estivesse desconectado. Não foi possível carregar novos programas, mas os da memória estavam funcionando bem até que precisassem de arquivos do disco.


Isso não parece muito eficiente. Eu acho que o Windows faria um mapeamento de memória para que as páginas sejam carregadas sob demanda.
Sashoalm
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.