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?

Cheng
fonte

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.

KeithB
fonte
"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 :)

Phoshi
fonte
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 :)
JohnM2
fonte
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.

LawrenceC
fonte
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