O que acontece se eu deixar um aplicativo em execução acidentalmente e clicar em "Instalar agora" no Atualizador de software?

22

O Atualizador de software é exibido update-managere mostra as atualizações de segurança do Firefox, por exemplo. Naturalmente, clicarei em "Instalar agora" para continuar.

No entanto, o que acontece se eu ainda tiver o Firefox em execução quando fizer isso? Ainda atualizará o Firefox? A atualização será ignorada e aparecerá da próxima vez, novamente? A atualização forçará o Firefox a fechar e talvez travar? Ele atualizará apenas parcialmente o software e possivelmente interromperá a instalação do Firefox?

pé fino
fonte
10
Nada acontece, o Firefox está aberto no Ram. Às vezes, ele detecta a atualização e diz para você reiniciar o navegador. Mas talvez alguém com mais discernimento e referências possa dar uma resposta melhor.
pLumo
3
Eu não sei especificamente sobre o Ubuntu, mas no Arch (e não acho que seja tão diferente nesse caso), atualizar o firefox sob seus pés durante a execução parece funcionar, mas a primeira coisa que você faz no firefox trava o coisa. Eu sempre atribuí isso à natureza complexa dos navegadores modernos, carregando em tempo de execução todo tipo de coisa. Mas o Firefox é a única coisa que acontece comigo.
tomsmeding
2
O Firefox irá parar na próxima vez que você abrir uma guia e informar que ele precisa reiniciar. Outros aplicativos podem fazer algo diferente.
Michael Hampton

Respostas:

40

Você deve estar pensando no Windows. O Unix fez certo e, mais tarde, o Windows apareceu e desenvolveu maneiras erradas de fazer as coisas.

No Windows, a substituição de um arquivo em uso por um processo em execução pode afetar gravemente esse processo. O processo fará referência a locais nesse arquivo e obterá informações incorretas, geralmente com resultados catastróficos. É por isso que uma atualização do Windows geralmente requer uma reinicialização para garantir que todos os processos estejam usando versões corretas das bibliotecas etc.

Com o Unix, depois que um arquivo é aberto por um processo, esse mesmo arquivo estará sempre disponível para o processo, mesmo que o arquivo original seja removido do sistema de arquivos .

Após uma atualização, o sistema de arquivos conterá uma versão diferente do arquivo e todo o processo iniciado após a atualização usará esse novo arquivo. Mas, diferentemente do Windows, todos os processos antigos do Unix continuarão usando os arquivos originais com os quais começaram. Mesmo que não sejam mais acessíveis pelo sistema de arquivos, esses arquivos persistirão desde que qualquer processo os esteja usando. Eventualmente, quando nenhum processo estiver usando os arquivos, a versão antiga dos arquivos será finalmente excluída.

Obviamente, você pode decidir reiniciar o Firefox (ou outros processos) se quiser obter os benefícios da atualização imediatamente. A escolha é sua.

Ray Butterworth
fonte
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Thomas Ward
18

Normalmente, atualizar um programa enquanto ele já está aberto não é problema - como os outros respondentes explicaram, um processo em execução pode continuar em execução, mesmo que seu executável seja excluído.

No entanto, devido ao modelo de processos múltiplos do Firefox, você pode receber uma solicitação para reiniciá-lo após uma atualização de qualquer maneira. Isso ocorre porque o Firefox gera novos processos para isolar sites diferentes; portanto, se ele gerar um novo processo após a atualização, mas antes de reiniciar o Firefox, o novo processo será uma versão mais recente do Firefox que o restante do navegador. Isso pode causar vários problemas; portanto, o Firefox pode solicitar que você o reinicie antes de continuar.

Aliás, o Chrome evita isso usando um processo "zigoto" que fica parado sem fazer nada; quando o navegador precisa gerar um novo processo, em vez de solicitar ao SO que execute o navegador executável novamente (o que executaria o binário possivelmente atualizado), ele solicita que o processo zigoto se duplique, e uma das cópias se torna um renderizador normal processo.

Josh
fonte
1
Além disso, com um aplicativo complexo como o Firefox, tudo o que for necessário para lidar com qualquer coisa que encontrar não é carregado na memória quando o programa é iniciado. Portanto, os componentes carregados conforme necessário podem criar uma incompatibilidade de versões da mesma forma. Eu sempre tive o Firefox travar ao atualizá-lo enquanto estava em execução.
fixer1234
Não são apenas navegadores com modelos de vários processos, mas qualquer situação em que as bibliotecas são usadas para IPC e as bibliotecas podem ser carregadas antes e após a atualização - embora os navegadores sejam provavelmente o exemplo mais conhecido hoje em dia (interoperabilidade COM no Windows sendo bastante prevalente significa que muitos outros programas podem implicitamente fazer algo assim). Também não consigo imaginar que o Chrome evite completamente esse problema com o processo zygote - ele realmente carrega todas as bibliotecas necessárias em qualquer momento da inicialização?
Voo
O @Voo pergunta "ele realmente carrega todas as bibliotecas necessárias em qualquer momento da inicialização?". Não conheço esse exemplo específico, mas em geral não é necessário. Tudo o que é necessário é garantir que cada biblioteca possível seja aberta na inicialização, garantindo assim que os dados corretos serão lidos, caso sejam necessários. Abrir um arquivo (ou dezenas de arquivos) é uma despesa trivial em comparação com o carregamento de tudo o que eles contêm.
Ray Butterworth
@ Ray Curiosidade: o dlopen usa apenas um nome de arquivo, mas não os descritores, para que não seja tão simples quanto você imaginava (você pode brincar com / proc, mas isso é notoriamente diferente nos * nixes). Mas o problema maior é que isso eliminaria a maioria dos casos de uso em que o carregamento dinâmico é usado para começar.
Voo
@ Voo, desculpe, eu pensei erroneamente que este comentário estava no segmento orientado a unix, não sobre Windows e DLLs.
Ray Butterworth