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


28

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?


Respostas:


36

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.


11
Não é a resposta perfeita, leia unix.stackexchange.com/q/121013/55673
Usuário registrado

@registereduser: oh sim, essa pergunta me lembrou minhas lições do sistema operacional. Editarei minha resposta assim que eu colocar minhas mãos na minha área de trabalho (no meu telefone agora)
jobin

Eu acho que para scripts curtos não deve haver problema.
Becko

1
Quando tentei isso com o bash v3.2.48 (veja aqui ), ele não foi armazenado em buffer além do fim da linha (e falhou muito quando modifiquei o script enquanto ele era executado). Acabei de testar novamente com o bash v4.3.0 e ele armazenou em buffer todo o script (curto). Então ... eu não contaria com nenhum comportamento em particular.
Gordon Davisson

1
@RegisteredUser Não está em todas as versões do bash - veja o exemplo que vinculei.
Gordon Davisson

4

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" >filepartir do shell (outra instância) realmente substituirá o arquivo, eu acho. Mas se você editar o arquivo com, por exemplo, emacse 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.


+1 Estou usando Sublime Text como meu editor. Você sabe se ele também renomeia o arquivo, como emacs?
Becko

1
Acho que a maioria dos editores usaria um esquema de renomeação (mesmo que não devessem manter as versões de backup) para evitar o risco de que, se ocorresse uma falha durante o processo de gravação, nenhuma versão intacta do texto permanecesse. Você pode verificar com "ls -i" (que mostra os números dos inodes) qual é o comportamento do seu editor.
Marc van Leeuwen

1

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.


0

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 usemv 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 comokill -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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.