Posso modificar um arquivo de script bash (.sh) enquanto ele está em execução?

26

Suponha que eu tenha um script script.sh , que leva algum tempo para ser executado. Eu executo, ./script.sh . Enquanto ele está sendo executado em uma janela de terminal, modifico o arquivo script.sh . Isso terá algum efeito no processo já em andamento?

Depois de modificá-lo, eu executo o arquivo modificado, então eu tenho dois processos em execução agora. Está tudo bem?

    
por becko 16.06.2014 / 16:22

4 respostas

34

Quando você faz 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 em sua memória (RAM).

Assim, as alterações feitas no script não afetarão o script em execução; ele executará a versão executada antes de fazer essas alterações.

No entanto, quando você executar o script alterado novamente sem encerrar a instância anteriormente em execução, haverá duas instâncias do script - uma com as alterações e a antiga.

Esteja avisado 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 o arquivo para gravação e não será executado corretamente.

Atualização: Obrigado ao Usuário Registrado por me indicar uma resposta melhor no Unix.stackexchange.com.

Dependendo do tamanho do script e do compilador / interpretador em questão, o script é carregado parcial / completamente. Portanto, se o script não estiver completamente carregado, as alterações feitas no script refletirão na instância em execução assim que a parte do script for carregada na memória.

Portanto, não é recomendado alterar seu script no disco que está sendo executado para saída imprevisível: primeiro, pare a instância em execução e, em seguida, modifique o script e execute novamente o script.

    
por jobin 16.06.2014 / 16:24
4

Adicionarei algo que acho que não foi dito nas outras respostas. Muito depende de apenas como você edita o arquivo. Fazer echo "stuff" >file do shell (outra instância) irá sobrescrever o arquivo, eu acho. Mas se você editar o arquivo com por exemplo emacs e depois salvar, isso não acontecerá. Em vez disso, o editor renomeia o arquivo antigo para algum nome de backup (talvez removendo o backup anterior) e, em seguida, grava seu conteúdo de buffer modificado como um arquivo novo com o nome antigo (em libreated) . Uma vez que o shell (ou outro interpretador) lendo o script quase certamente abrirá o arquivo apenas uma vez, ele será independente do paradeiro do arquivo nome , ele apenas continuará a ler o arquivo do disco físico (identificado por número de inode) que estava associado ao nome do arquivo no momento da abertura. Portanto, mesmo se ele ler o script em blocos (que seria a solução mais fácil se estiver usando E / S de texto em buffer), ele continuará a ler as linhas da antiga instância do arquivo, o que provavelmente não será alterado pela sua edição.

    
por Marc van Leeuwen 16.06.2014 / 18:52
0

A resposta de @ jobin é geralmente correta, mas adicionarei algumas outras respostas que podem estar no ponto dependendo do que você deseja fazer.

Se você quiser alterar o script e quiser saber se ele é seguro, será necessário gravar em um novo arquivo, não no existente. O novo arquivo pode estar localizado onde o arquivo antigo estava. Escreva sua nova versão em um novo arquivo e, em seguida, use mv para movê-lo para o lugar acima do antigo. O arquivo que foi substituído ainda existe, ele simplesmente 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 limpá-lo com segurança (imediatamente ou posteriormente).

Se você quiser se comportar rapidamente no comportamento do script, terá um problema mais difícil. Espero que você precise compilá-lo no código do script. Os scripts Bash podem manipular sinais (por exemplo, podem capturar algo como kill -USR1 [pid] ), e um script pode responder recarregando algum código. Então talvez você possa ter uma funcionalidade próxima do que você quer, mas sem saber o que você está procurando, não vejo uma boa razão para fazer isso, e eu suspeito que se você quiser fazer algo tão complexo, você provavelmente vai querer um mais sofisticado linguagem de programação para fazê-lo em.

Se você quiser hackear o comportamento de um script em execução que não está escrito com isso em mente, você está sem sorte. Eu hesitaria em chamar qualquer tarefa de programação impossível, mas se você tivesse os recursos e habilidades para esse tipo de tarefa, você presumivelmente não estaria perguntando aqui.

    
por mc0e 16.06.2014 / 18:27
0

isso precisa ser atualizado, as respostas acima agora estão parcialmente corretas:

com a versão atual do bash, modificando um script no disco enquanto ele estiver rodando, fará com que o bash "tente" carregar as mudanças na memória e as usará no script de execução. Se suas alterações vierem após a linha atualmente em execução, as novas linhas serão carregadas e executadas. mas, isso é um palpite por 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 que, quando você fornecer uma nova versão na etapa 3, nenhuma tentativa do bash seja feita para carregar o novo conteúdo na versão da memória.

    
por ivor 12.03.2017 / 16:53