Um serviço meu morreu recentemente devido a oom-kill
.
$ systemctl status my-server.service
● my-server.service - "General purposes load-independent HTTP server"
Loaded: loaded (/lib/systemd/system/my-server.service; enabled; vendor preset: enabled)
Active: failed (Result: oom-kill) since Thu 2025-02-27 12:47:44 CST; 17h ago
Process: 636 ExecStart=/usr/bin/my-server --listen-http :13668 --threads 10 (code=exited, status=0/SUCCESS)
Main PID: 636 (code=exited, status=0/SUCCESS)
CPU: 52min 57.893s
Feb 27 12:47:44 ios systemd[1]: my-server.service: A process of this unit has been killed by the OOM killer.
Feb 27 12:47:44 ios my-server[636]: Received signal to stop (15). Stopping...
Feb 27 12:47:44 ios systemd[1]: my-server.service: Failed with result 'oom-kill'.
Feb 27 12:47:44 ios systemd[1]: my-server.service: Consumed 52min 57.893s CPU time.
man systemd.exec
diz $SERVICE_RESULT
que está definido para oom-kill
quando "Um processo de serviço foi encerrado pelo assassino de falta de memória (OOM)".
Este foi um vazamento de memória em um processo filho de longa duração de /usr/bin/my-server
. Quando isso acontece, eu gostaria de Restart=
o serviço.
A questão:
Isso $SERVICE_RESULT=oom-kill
aciona um código de saída impuro ou um sinal impuro?
Gostaria de limitar Restart=
o máximo possível. Assim, gostaria de escolher a primeira condição que atende aos oom-kill
critérios da lista abaixo:
Restart=on-abort
pode ser usado se for um sinal impuro.Restart=on-abormal
pode ser usado para o caso acima, ou se acionar a causa de tempo limite ou causa de watchdog (provavelmente não aplicável).Restart=on-failure
funciona para todos os casos acima, além de um código de saída impuro.Restart=always
teoricamente cobre tudo
De man systemd.service
:
Table 2. Exit causes and the effect of the Restart= settings
┌──────────────────────┬────┬────────┬────────────┬────────────┬─────────────┬──────────┬─────────────┐
│Restart settings/Exit │ no │ always │ on-success │ on-failure │ on-abnormal │ on-abort │ on-watchdog │
│causes │ │ │ │ │ │ │ │
├──────────────────────┼────┼────────┼────────────┼────────────┼─────────────┼──────────┼─────────────┤
│Clean exit code or │ │ X │ X │ │ │ │ │
│signal │ │ │ │ │ │ │ │
├──────────────────────┼────┼────────┼────────────┼────────────┼─────────────┼──────────┼─────────────┤
│Unclean exit code │ │ X │ │ X │ │ │ │
├──────────────────────┼────┼────────┼────────────┼────────────┼─────────────┼──────────┼─────────────┤
│Unclean signal │ │ X │ │ X │ X │ X │ │
├──────────────────────┼────┼────────┼────────────┼────────────┼─────────────┼──────────┼─────────────┤
│Timeout │ │ X │ │ X │ X │ │ │
├──────────────────────┼────┼────────┼────────────┼────────────┼─────────────┼──────────┼─────────────┤
│Watchdog │ │ X │ │ X │ X │ │ X │
└──────────────────────┴────┴────────┴────────────┴────────────┴─────────────┴──────────┴─────────────┘