Depende do kernel e do tipo de executável. Não depende de como o executável foi iniciado ou instalado.
No Linux:
-
Para executáveis nativos (ou seja, binários contendo código de máquina, executados diretamente pelo kernel), um executável não pode ser modificado durante a execução.
$ cp /bin/sleep . $ ./sleep 999999 & $ echo >sleep sh: 1: cannot create sleep: Text file busy
É possível remover o executável (isto é, desvinculá-lo) e criar um novo no mesmo caminho. Como qualquer outro caso em que um arquivo é removido enquanto ainda está aberto, a remoção do executável não afeta o processo em execução e, na verdade, não o remove do disco até que o arquivo não esteja mais em uso, ou seja, até que todas as instâncias em execução sejam executadas. a saída do programa.
-
Para scripts (começando com
#!
), o arquivo de script pode ser modificado enquanto o programa está em execução. Se isso afeta o programa depende de como o interpretador lê o script. Se ele ler todo o script em sua própria memória antes de começar a executar, a execução não será afetada. Se o interpretador ler o script sob demanda, a execução poderá ser afetada; algumas implementações desh
fazem isso.
Muitos outros sistemas Unix se comportam dessa maneira, mas não todos. As versões antigas do IIRC do Solaris permitem modificar um executável nativo, o que geralmente faz com que ele falhe. Algumas variantes Unix, incluindo HP / UX, nem permitem a remoção de um executável nativo que está sendo executado atualmente.
A maioria dos programas de instalação de software tem o cuidado de remover um executável existente antes de colocar um novo no lugar, ao invés de sobrescrever o binário existente. Por exemplo. fazer
rm /bin/target
cp target /bin
em vez de apenas cp target /bin
. O comando install
shell faz as coisas desta maneira. Isso não é ideal, porque se alguém tentar executar /bin/target
enquanto o processo cp
estiver em execução, ele receberá um programa corrompido. É melhor copiar o arquivo para um nome temporário e depois renomeá-lo para o nome final. Renomear um arquivo (ou seja, movê-lo dentro do mesmo diretório ou, mais geralmente, movê-lo dentro do mesmo sistema de arquivos) remove o arquivo de destino anterior, se houver. É assim que dpkg
funciona, por exemplo.
cp target /bin/target.tmp
mv /bin/target.tmp /bin/target