我的一项服务最近因 而停止运行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
当“服务进程被内存不足(OOM)终止程序终止”时,表示$SERVICE_RESULT
设置为“服务进程被内存不足(OOM)终止程序终止”。oom-kill
这是 的长期运行子进程中发生的内存泄漏/usr/bin/my-server
。发生这种情况时,我希望Restart=
服务能够正常运行。
问题:
是否$SERVICE_RESULT=oom-kill
触发不干净的退出代码,或者不干净的信号?
我想Restart=
尽可能地限制自己。因此,我想oom-kill
从以下列表中选择符合条件的第一个条件:
Restart=on-abort
如果它是一个不干净的信号,则可以使用它。Restart=on-abormal
可以用于上述情况,或者如果它触发超时原因,或看门狗原因(可能不适用)。Restart=on-failure
适用于上述所有情况,外加不干净的退出代码。Restart=always
理论上涵盖一切
从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 │
└──────────────────────┴────┴────────┴────────────┴────────────┴─────────────┴──────────┴─────────────┘
都不是。它不会触发任何退出原因,因为它本身就是一个退出原因– “内存不足终止”是一个单独的类别,未在表中列出。
和
on-failure
都会on-abnormal
处理 SERVICE_FAILURE_OOM_KILL,而on-abort
不会。(当然,“on-watchdog” 也不会。)没有隐藏的“on-oom”。然而,在没有 OOM 管理的旧 systemd 版本中,内核会发出 SIGKILL,这总是导致“信号”退出(因为 SIGKILL 无法被自定义信号处理程序捕获)。