Estou escrevendo um script de shell no bash. Em algum momento do script, ele detecta que a máquina precisa ser reinicializada antes de continuar. Emite:
sudo reboot
Quando a máquina volta a funcionar, há mais trabalho que esse script precisa executar. Como faço para configurar algo para continuar fazendo o trabalho neste script?
Estou assumindo que existe algum lugar em que posso escrever um shell script para que seja executado na próxima reinicialização. Onde é esse lugar? Vejo que o cron possui uma diretiva @reboot. Eu também sei que serviços como o Apache são iniciados na inicialização pelo iniciante. Qualquer um desses mecanismos seria apropriado? Se sim, como isso seria acionado?
Este script precisa ser executado apenas uma vez, nem toda reinicialização. Portanto, ele terá que ir para algum lugar que seja executado na próxima reinicialização ou poderá se remover depois que for executado.
Esta pergunta pergunta sobre como salvar o estado do seu aplicativo após a reinicialização. Meu script não tem muito estado, então eu posso gerenciar isso. Eu só preciso saber como esse script aciona algo para executar após a próxima reinicialização.
Minha versão específica é o Ubuntu Linux 14.04. O script original é iniciado na linha de comando por um administrador do sistema (em vez de executar a partir do cron).
fonte
Respostas:
Em um sistema, a única coisa realmente persistente é um arquivo. Isso é basicamente o que você deve usar. Aqui está uma solução usando um script init.d.
Vamos considerar o seguinte script (simples)
/etc/init.d/myupdate
:Se você ativá-lo com
update-rc.d myupdate defaults
, astart
ação será executada na inicialização. Agora, quando o script de atualização solicitar uma reinicialização:Com esta solução, você pode dividir seu script de atualização em duas partes:
Ele executará a
before_reboot
seção de código, criará um arquivo/var/run
e reinicializará. Na inicialização, o script será chamado novamente, mas, como o arquivo existe,after_reboot
será chamado em vez debefore_reboot
.Observe que
update-rc.d
requer privilégios de root.Sem usar um arquivo (do comentário de Stephen Ostermiller ):
Se você estiver familiarizado com o
getopts
utilitário, convém usar opções em vez de arquivos. No script init, chame o script com:E no seu script, verifique as opções em vez de arquivos. Chame seu script uma vez sem a opção, e o init.d o chamará novamente na inicialização, desta vez com
-r
.Você encontrará mais informações sobre o manuseio de opções aqui (apenas para opções curtas) . Também editei meu script com chamadas para
update-rc.d
manter esse trabalho único (de outro comentário).fonte
/path/to/update/script --after-reboot
do/etc/init.d/myupdate
que confiar na presença de/var/run/rebooting-for-updates
. Então ele teria argumentos diferentes quando executado diretamente versus chamado na inicialização.update-rc.d myupdate defaults
eupdate-rc.d myupdate remove
ao próprio script, além da gravação e remoção,/etc/init.d/myupdate
para que não deixe os arquivos por aí.INIT INFO
secção: wiki.debian.org/LSBInitScripts