Suponha que eu tenho um script script.sh
, que leva algum tempo para ser executado. Eu executo isso ./script.sh
. Enquanto ele está sendo executado em uma janela de terminal, eu modifico o arquivo script.sh
. Isso terá algum efeito no processo já em execução?
Depois de modificá-lo, executo o arquivo modificado, então tenho dois processos em execução agora. Tudo bem?
scripts
filesystem
becko
fonte
fonte
Respostas:
Ao fazer alterações no seu script, você faz as alterações no disco (disco rígido - o armazenamento permanente); Quando você executa o script, o script é carregado na sua memória (RAM).
Portanto, as alterações que você fizer no script não afetarão o script em execução, ele executará a versão que você executou antes de fazer essas alterações.
No entanto, quando você executa o script alterado novamente sem encerrar a instância em execução anterior, haverá duas instâncias do script - uma com as alterações e a antiga.
Esteja avisado de que os recursos que o script usa e modifica entrarão em conflito. Por exemplo, se você estiver modificando um arquivo usando o script, o script executado posteriormente não poderá abrir esse arquivo para gravação e falhará na execução correta.
Atualizar: Obrigado ao Usuário Registrado por me indicar uma resposta melhor no Unix.stackexchange.com.
Dependendo do tamanho do script e do compilador / intérprete em questão, o script é carregado parcialmente / completamente. Portanto, se o script não estiver completamente carregado, as alterações que você fizer no script refletirão na instância em execução assim que a parte do script for carregada na memória.
Portanto, não é recomendável alterar seu script no disco que está sendo executado no momento para obter uma saída imprevisível: Primeiro pare a instância em execução, modifique-o e, em seguida, execute-o novamente.
fonte
Vou acrescentar algo que acho que não foi dito nas outras respostas. Depende muito de como você edita o arquivo. Fazer a
echo "stuff" >file
partir do shell (outra instância) realmente substituirá o arquivo, eu acho. Mas se você editar o arquivo com, por exemplo,emacs
e depois salvar, isso não acontecerá. Em vez disso, aqui o editor renomeia o arquivo antigo para algum nome de backup (talvez removendo o backup anterior) e, em seguida, grava o conteúdo do buffer modificado como um novo arquivo com o nome antigo (agora liberado) . Como o shell (ou outro intérprete) que lê o script quase certamente abrirá o arquivo apenas uma vez, é independente do paradeiro do nome do arquivo., ele continua a ler o arquivo do disco físico (identificado pelo número do inode) associado ao nome do arquivo no momento da abertura. Portanto, mesmo que ele leia o script em blocos (que seria a solução mais fácil se você usar E / S de texto em buffer), continuará lendo as linhas da instância antiga do arquivo, o que provavelmente não será alterado pela sua edição.fonte
emacs
?isso precisa ser atualizado, as respostas acima agora estão apenas parcialmente corretas:
com a versão atual do bash, modificar um script no disco enquanto estiver em execução fará com que o bash "tente" carregar as alterações na memória e assumi-las no script em execução. se suas alterações vierem após a linha atualmente em execução, as novas linhas serão carregadas e executadas. mas, esse é um palpite do bash e pode ser certo ou errado.
a melhor maneira de fazer isso é a seguinte sequência de ações: 1) carregue o script na memória 2) exclua o script do disco 3) escreva um novo script no disco excluindo a versão do disco primeiro, a versão da memória perde seus links para ele para que, ao fornecer uma nova versão na etapa 3, nenhuma tentativa do bash seja feita para carregar o novo conteúdo na versão de memória.
fonte
A resposta de @ jobin geralmente está correta, mas adicionarei outras respostas que podem ser úteis dependendo do que você deseja fazer.
Se você deseja alterar o script e deseja saber que é seguro, você deseja gravar em um novo arquivo, não no existente. O novo arquivo pode ser localizado onde estava o antigo. Escreva sua nova versão em um novo arquivo e use
mv
a para posicioná-la por cima da antiga. O arquivo que foi substituído ainda existe, mas não está vinculado a partir do diretório. Seu script em execução pode continuar usando-o e, quando esse script fecha seu identificador de arquivo, o sistema sabe que pode limpar o arquivo com segurança (imediatamente ou posteriormente).Se você deseja se comportar com rapidez no script, você tem um problema mais difícil. Espero que você precise incorporá-lo no código do script. Os scripts bash podem lidar com sinais (por exemplo, podem capturar algo como
kill -USR1 [pid]
), e um script pode responder recarregando algum código. Talvez você possa ter uma funcionalidade próxima do que deseja, mas sem saber o que está procurando, não estou vendo uma boa razão para fazer isso, e suspeito que, se você quiser fazer algo tão complexo, provavelmente desejará um ambiente mais sofisticado. linguagem de programação para fazê-lo.Se você deseja invadir o comportamento de um script em execução que não está escrito com isso em mente, está sem sorte. Eu hesitaria em chamar qualquer tarefa de programação impossível, mas se você tivesse os recursos e as habilidades para esse tipo de tarefa, provavelmente não perguntaria aqui.
fonte