Digamos que estou executando um software e, em seguida, executo o gerenciador de pacotes para atualizar o software. Percebo que o Linux não interrompe o processo em execução para atualização de pacotes - ele ainda está funcionando bem. Como o Linux faz isso?
Responder1
A razão é que o Unix não bloqueia um arquivo executável enquanto ele é executado ou mesmo se gostar do 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 depois que o arquivo foi excluído (na verdade, desvinculado) 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 Unix e Windows. Este último não pode atualizar um arquivo bloqueado, pois falta uma camada entre os nomes dos arquivos e os inodes, o que dificulta a atualização ou até mesmo a instalação de alguns pacotes, pois geralmente requer uma reinicialização completa.
Responder2
Os executáveis geralmente são abertos uma vez, anexados a um descritor de arquivo e não possuem um descritor de arquivo para seu binário reaberto durante um único período de execução. Por exemplo, se você executar bash
, exec()
geralmente cria apenas um descritor de arquivo para o inode apontado /bin/bash
uma vez - na chamada.
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 existe 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 ser executado novamente através do caminho a partir do qual foi executado. Também pode haver problemas se os programas estiverem interligados e um for executado antes da atualização e outro depois (possivelmente pelo primeiro programa). Isto também é verdade para algumas bibliotecas.
Porém, para casos de uso simples, é seguro atualizar sem reiniciar o processo.