Como mencionado, você nunca deve ter um loop que bloqueia um script de inicialização.
O que eu faria é criar outro script que seja visto como o serviço. Esse script teria o loop e ele iniciaria o serviço em primeiro plano para que o loop se tornasse algo realmente simples:
#!/bin/sh
while true
do
start-service ...
sleep 30
done
No seu arquivo init, você faz referência a esse script com thin ou qualquer outro mecanismo que inicie um serviço. Então você acabou de adicionar uma camada que garante que o serviço continue em execução.
Agora, você também pode querer ter uma maneira de saber quando o usuário tenta parar o servidor ... você não tem isso em seu loop também. Algo assim provavelmente:
#!/bin/sh
while true
do
start-service ...
# service properly terminated?
if ! test -f /var/run/service-id
then
exit 0
fi
sleep 30
done
Se o arquivo / var / run / service-id for excluído antes que o software "start-service" retorne, você estará bem. Isso também significa que, se o serviço falhar, o arquivo não deve ser excluído automaticamente (obviamente).
Talvez você também possa usar o valor de retorno do serviço. Nesse caso, você poderia fazer isso em vez disso (lembre-se que funciona somente se o próprio serviço bloquear):
#!/bin/sh
while true
do
if start-service ...
then
# service cleanly terminated
exit 0
fi
sleep 30
done
Observe que esse tipo de coisa reiniciará o aplicativo automaticamente, mas não fará nada para forçar o aplicativo. para sair. Se o aplicativo. não falha, mas ainda fica ruim depois de um tempo (por exemplo, lento), então você precisaria de mais heurística para parar ...