V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
huangya
V2EX  ›  Linux

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

  •  
  •   huangya · Jul 13, 2022 · 3262 views
    This topic created in 1394 days ago, the information mentioned may be changed or developed.

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

    Supplement 1  ·  Jul 14, 2022
    @mons
    @changnet
    @charlie21
    @codehz
    @billlee
    @qwq11
    @julyclyde
    感谢各位的建议和参与,原因找到了,ExecStartPost=/bin/sh -c '(/usr/ccsp/wifi/bridge_mode.sh)' 这个脚本执行完后返回不是为 1.
    11 replies    2022-07-14 10:22:56 +08:00
    huangya
        2
    huangya  
    OP
       Jul 13, 2022
    @mons 没有 systemd-oomd
    root@RaspberryPi-Gateway:~# systemctl status systemd-oomd
    Unit systemd-oomd.service could not be found.
    changnet
        3
    changnet  
       Jul 13, 2022
    系统杀进程,试下 dmesg 日志,一般的原因像 OOM 它都会告诉你这进程占了多少内存,权重是多少,然后被杀
    charlie21
        4
    charlie21  
       Jul 13, 2022 via iPhone
    1 权限
    2 它本身不是常驻后台进程
    codehz
        5
    codehz  
       Jul 13, 2022 via Android
    你先发出 service 文件看下呗
    billlee
        6
    billlee  
       Jul 13, 2022 via Android
    先看一下日志

    sudo journalctl --unit 服务名
    huangya
        7
    huangya  
    OP
       Jul 13, 2022
    @changnet 你说的这个是 linux kernel 发起的。对于这个问题 dmesg , 里面没有看大 linux kernel 的 oom killer 发起了 kill 进程的 log
    huangya
        8
    huangya  
    OP
       Jul 13, 2022
    @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  
       Jul 13, 2022
    @huangya
    Type=forking 的需要程序主动 fork 然后退出主进程,你确定它有这个行为?
    shxxy
        10
    shxxy  
       Jul 13, 2022   ❤️ 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  
       Jul 14, 2022
    如果是 TERM 信号,有很多是 Type 和实际情况不对应导致的,到超时时间,按照指定 Type 判断,仍未觉得这服务已经成功运行,就会重新启动一轮

    如果 KILL 有可能是 oom

    都是有日志可以看的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5895 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 67ms · UTC 06:34 · PVG 14:34 · LAX 23:34 · JFK 02:34
    ♥ Do have faith in what you're doing.