进程被 systemd kill 了,原因是什么?

2022-07-13 18:00:13 +08:00
 huangya

service 是被 systemd 启动的,可是在 servrice 进入 loop 的时候,被 /lib/systemd/systemd kill 了。我为什么知道是被 systemd kill 了呢?因为我用 strace 命令追踪了它的系统调用。发现它向 service 发送了 SIGTERM 信号。如果用 systemctl start 重启,又会被杀。可是我如果手动键入命令行重启,就正常了。

老实说,以前只是粗浅了解过 systemd. 难道 systemd 发现了什么异常情况然后想杀掉 service?比如内存使用过多?因为我看启动 log 提示代码中有 calloc()函数分配失败的情况。不过由于代码过于庞大,目前还没有找到是哪里调用的 calloc () 。网上搜索了一下,发现 systemd 限制内存似乎要看 /sys/fs/cgroup/memory/system.slice/。可是我系统上连 /sys/fs/cgroup/memory 都不存在。

2547 次点击
所在节点    Linux
11 条回复
mons
2022-07-13 18:27:03 +08:00
huangya
2022-07-13 18:39:56 +08:00
@mons 没有 systemd-oomd
root@RaspberryPi-Gateway:~# systemctl status systemd-oomd
Unit systemd-oomd.service could not be found.
changnet
2022-07-13 18:48:51 +08:00
系统杀进程,试下 dmesg 日志,一般的原因像 OOM 它都会告诉你这进程占了多少内存,权重是多少,然后被杀
charlie21
2022-07-13 18:52:53 +08:00
1 权限
2 它本身不是常驻后台进程
codehz
2022-07-13 18:57:03 +08:00
你先发出 service 文件看下呗
billlee
2022-07-13 19:49:14 +08:00
先看一下日志

sudo journalctl --unit 服务名
huangya
2022-07-13 21:37:02 +08:00
@changnet 你说的这个是 linux kernel 发起的。对于这个问题 dmesg , 里面没有看大 linux kernel 的 oom killer 发起了 kill 进程的 log
huangya
2022-07-13 21:42:32 +08:00
@codehz 因为是一个非常小众的 linux 路由器发行版,所以就没有发出来 service 文件。内容如下
[Unit]
Description=Cosa service
After=CcspPandMSsp.service

[Service]
Type=forking
PIDFile=/var/tmp/CcspWifiAgent.pid
WorkingDirectory=/usr/ccsp/wifi
Environment="Subsys=eRT."
Environment="LOG4C_RCPATH=/etc"
EnvironmentFile=/etc/device.properties
ExecStart=/usr/bin/CcspWifiSsp -subsys $Subsys
ExecStopPost=/bin/sh -c 'echo "`date`: Stopping/Restarting CcspWifiSsp" >> ${PROCESS_RESTART_LOG}'
ExecStartPost=/bin/sh -c '(/usr/ccsp/wifi/bridge_mode.sh)'
#Restart=always
codehz
2022-07-13 21:45:54 +08:00
@huangya
Type=forking 的需要程序主动 fork 然后退出主进程,你确定它有这个行为?
qwq11
2022-07-13 22:33:02 +08:00
Google 搜了一下,第一个结果就是这个
https://unix.stackexchange.com/questions/200280/systemd-kills-service-immediately-after-start
简单来说,forking 要求服务启动后,立马 fork 出一个进程,然后退出,fork 出来的这个进程将被视为 service 的主进程,如果没有立马(超时前) fork 出进程,systemd 视其为启动失败,没有马上退出也是如此。你把 forking 改成 simple 应该就行。

可以读读上面那个链接,解释的很好,文笔也不错
julyclyde
2022-07-14 10:22:56 +08:00
如果是 TERM 信号,有很多是 Type 和实际情况不对应导致的,到超时时间,按照指定 Type 判断,仍未觉得这服务已经成功运行,就会重新启动一轮

如果 KILL 有可能是 oom

都是有日志可以看的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/865962

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX