Por que um pacote de software é executado bem quando está sendo atualizado?

28

Digamos que estou executando um software e, em seguida, executo o gerenciador de pacotes para atualizar o software, percebo que o Linux não reduz o processo de execução da atualização do pacote - ele ainda está funcionando bem. Como o Linux faz isso?

    
por Howard 30.04.2013 / 06:35

2 respostas

35

O motivo é que o Unix não bloqueia um arquivo executável enquanto ele é executado, ou mesmo se ele for como o Linux, esse bloqueio se aplica ao inode, não ao nome do arquivo. Isso significa que um processo que o mantém aberto está acessando os mesmos dados (antigos) mesmo após o arquivo ter sido excluído (desvinculado, na verdade) e substituído por um novo com o mesmo nome, que é essencialmente o que uma atualização de pacote faz.

Essa é uma das principais diferenças entre o Unix e o Windows. O último não pode atualizar um arquivo que está sendo bloqueado, pois está faltando uma camada entre nomes de arquivos e inodes, o que torna um grande problema atualizar ou mesmo instalar alguns pacotes, já que isso geralmente requer uma reinicialização completa.

    
por 30.04.2013 / 07:22
18

Os executáveis geralmente são abertos uma vez, anexados a um descritor de arquivo e não possuem um descritor de arquivo para o binário reaberto durante um único período de execução. Por exemplo, se você executar bash , exec() geralmente criará um descritor de arquivo para o inode apontado por /bin/bash once - on invocation.

Isso geralmente significa que, para binários simples que não tentam se reler durante a execução (usando o caminho pelo qual foram invocados), o conteúdo armazenado em cache permanece válido como um inode pendente. Isso significa que há essencialmente uma réplica da versão anterior do executável.

Em casos mais complexos, isso pode causar problemas. Por exemplo, um arquivo de configuração pode ser atualizado e, posteriormente, relido, ou o programa pode se reexecutar através do caminho do qual foi executado. Também pode haver problemas se os programas estiverem interconectados, e um for executado antes do upgrade e outro depois (possivelmente pelo primeiro programa). Isso também é verdade para algumas bibliotecas.

Para casos de uso simples, é seguro fazer upgrade sem reiniciar o processo.

    
por 30.04.2013 / 06:40