A maneira normal de fazer isso é deixar o programa sair e usar um sistema de monitoramento para reiniciá-lo. O programa init
oferece esse sistema de monitoramento. Existem muitos programas init diferentes (SysVinit, BusyBox, Systemd, etc.), com mecanismos de configuração completamente diferentes (sempre escrevendo um arquivo de configuração, mas o local e a sintaxe do arquivo são diferentes), então procure a documentação do arquivo que você está usando. Configure o init para iniciar seu programa no momento da inicialização ou mediante solicitação explícita e reiniciá-lo se ele morrer. Há também programas de monitoramento mais sofisticados, mas você não parece precisar deles. Essa abordagem tem muitas vantagens em ter o programa fazendo a reinicialização por si só: é padrão, para que você possa reiniciar vários serviços sem precisar se preocupar com como eles são feitos; funciona mesmo se o programa morrer devido a um bug.
Há um mecanismo padrão para que um processo saia: sinaliza . Envie seu programa um sinal TERM. Se o seu programa precisar executar alguma limpeza, escreva um manipulador de sinal. Isso não impede que um comando específico do programa seja desativado se você tiver um canal administrativo para enviar comandos desse tipo.