Eu acho que o seu problema é que o seu programa pode estar falhando, mas o vinho não está, então o systemd não vê nada errado (o PID ainda está por aí).
Em primeiro lugar, você pode encontrar alguma ajuda nas respostas a essa pergunta: Iniciar o serviço do SystemD condicionalmente
Eu acho que você pode precisar detalhar suas necessidades um pouco mais (e / ou, considere ajustá-las para simplificar a configuração).
Basicamente, acho que a solução se resumirá ao uso inteligente de ConditionPathExistsGlob =, possivelmente em uma unidade auxiliar.
Uma solução hacky pode envolver uma unidade temporizada com essa condição PathExistsGlob, que pode estar reiniciando seu serviço principal.
Eu tenderia a querer que essa unidade temporizadora também lidasse com a limpeza de arquivos / lixeiras, em vez de fazer a unidade principal fazê-lo, mas isso é quase certamente uma questão de gosto.
Então, eu não tocaria no que você tem, mas em vez disso, adicione algo como (NB: Isso é um palpite, e não testado):
[Unit]
Description=Detect and recover issues with Uploader
After=uploader.service
Requires=uploader.service
PartOf=uploader.service
AssertPathExistsGlob=/srv/uploader/crash*.dump
[Service]
Type=oneshot
ExecStart=cleanup_script
Restart=on-success
A lógica básica é:
- você executa isso em um timer, digamos a cada 5 minutos (ou o que for que faça sentido para as suas necessidades)
- se os arquivos de travamento não estiverem lá, a unidade do cronômetro não iniciará e o serviço principal do Uploader continuará mantendo
- se os arquivos de travamento estiverem lá, execute algum script personalizado para fazer a coisa certa com eles e reinicie nossa unidade de timer (que, por causa da PartOf, deve também reiniciar o serviço principal do Uploader)
Não estou dizendo que essa é uma ótima solução, mas pode ser uma solução