É seguro usar um script bash para criar um daemon?

6

Eu gostaria de criar uma caixa totalmente automatizada (baseada em algo como uma placa Raspberry-Pi ou OLinuXino).

Minha caixa rodaria um sistema baseado em Debian com um sistema de arquivos somente leitura e um ramdisk (para evitar corrupções no cartão SD).

Eu gostaria de criar um script que se conecte automaticamente a um servidor remoto (via ssh) cada vez que a caixa for ligada ou conectada a uma rede.

Para fazer isso, acho que minha solução mais simples é criar um script de shell executando como um daemon. Esse daemon terá que permanecer ativo até que a caixa seja desligada ou desconectada da rede. O script deve poder se reconectar quando a rede estiver ativa ou a caixa for reiniciada.

A pergunta: você acha que um shell script é seguro o suficiente para fazer isso? Ou devo usar melhor outra (e mais segura) linguagem de programação (PERL, C, ...)?

    
por lauhub 30.07.2014 / 23:14

3 respostas

7

Muitos daemons são executados usando o bash como linguagem de script. Você não terá problemas para usá-lo.

    
por 30.07.2014 / 23:37
3

Como regra geral, é bastante complicado criar um daemon no bash (ou shell-script em geral). Alguns problemas como bifurcação de fundo, saída e redirecionamento de mensagens de erro ou manipulação de sinais não são fáceis de acertar.

Para o problema específico que você descreve, já existe algum software (gratuito) fazendo conexão ssh automática com o respawn.

Eu uso autossh para essa finalidade. Ele é empacotado no Debian e funciona muito bem.

    
por 30.07.2014 / 23:44
1

É bastante seguro, mas pode ser menos que útil, a menos que bash esteja em condições de lidar com a limpeza. Se for morto por qualquer motivo, o script precisa ser capaz de se atualizar, a fim de atualizar seu estado conforme necessário - você provavelmente não quer simplesmente fazer:

while :

... por exemplo. Isso envelhece bem rápido. Em vez disso, talvez faça algo como:

trap '' HUP EXIT
set_state() { echo stuff="'$(otherstuff)'"... ; }
chk_interval() { wait for something... ; }
exec_me() { exec env - $(set_state) "$0" <in >out 2>alsoout & ; }
chk_interval
exec_me

Também pode depender de quem está fazendo a limpeza. O meio mais simples de implementar um daemon é:

init=path/to/executable/script

... na linha de comando do kernel para instalações particularmente de propósito único. Onde o exec relativo inferido aqui é o initramfs / .

    
por 31.07.2014 / 00:25

Tags