V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
huangya
V2EX  ›  Linux

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

  •  
  •   huangya · 2022-07-13 18:00:13 +08:00 · 2705 次点击
    这是一个创建于 883 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 都不存在。

    第 1 条附言  ·  2022-07-14 11:57:01 +08:00
    @mons
    @changnet
    @charlie21
    @codehz
    @billlee
    @qwq11
    @julyclyde
    感谢各位的建议和参与,原因找到了,ExecStartPost=/bin/sh -c '(/usr/ccsp/wifi/bridge_mode.sh)' 这个脚本执行完后返回不是为 1.
    11 条回复    2022-07-14 10:22:56 +08:00
    mons
        1
    mons  
       2022-07-13 18:27:03 +08:00
    huangya
        2
    huangya  
    OP
       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
        3
    changnet  
       2022-07-13 18:48:51 +08:00
    系统杀进程,试下 dmesg 日志,一般的原因像 OOM 它都会告诉你这进程占了多少内存,权重是多少,然后被杀
    charlie21
        4
    charlie21  
       2022-07-13 18:52:53 +08:00 via iPhone
    1 权限
    2 它本身不是常驻后台进程
    codehz
        5
    codehz  
       2022-07-13 18:57:03 +08:00 via Android
    你先发出 service 文件看下呗
    billlee
        6
    billlee  
       2022-07-13 19:49:14 +08:00 via Android
    先看一下日志

    sudo journalctl --unit 服务名
    huangya
        7
    huangya  
    OP
       2022-07-13 21:37:02 +08:00
    @changnet 你说的这个是 linux kernel 发起的。对于这个问题 dmesg , 里面没有看大 linux kernel 的 oom killer 发起了 kill 进程的 log
    huangya
        8
    huangya  
    OP
       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
        9
    codehz  
       2022-07-13 21:45:54 +08:00
    @huangya
    Type=forking 的需要程序主动 fork 然后退出主进程,你确定它有这个行为?
    qwq11
        10
    qwq11  
       2022-07-13 22:33:02 +08:00   ❤️ 1
    Google 搜了一下,第一个结果就是这个
    https://unix.stackexchange.com/questions/200280/systemd-kills-service-immediately-after-start
    简单来说,forking 要求服务启动后,立马 fork 出一个进程,然后退出,fork 出来的这个进程将被视为 service 的主进程,如果没有立马(超时前) fork 出进程,systemd 视其为启动失败,没有马上退出也是如此。你把 forking 改成 simple 应该就行。

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

    如果 KILL 有可能是 oom

    都是有日志可以看的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4846 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:58 · PVG 16:58 · LAX 00:58 · JFK 03:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.