【问题标题】:systemd: SIGTERM immediately after startsystemd:启动后立即 SIGTERM
【发布时间】:2016-06-05 20:54:26
【问题描述】:

我是第一次尝试 systemd。我想在系统启动时启动一个进程。我在启动和运行时遇到了问题。

systemd 应该运行一个脚本 (start.sh)。该脚本在后台启动一个进程(我们称之为 P)并以代码 0 退出。 P 会一直运行直到有信号发生。

如果我手动运行 start.sh 一切正常。

如果我让它由 systemd 启动,P 在启动后立即获得一个 SIGTERM 并终止。

所以它开始了,但是信号呢? 它终止了 P,我不确定它的起源和原因。

也许我的单位是错误的,但我不知道如何设置它以满足我的需要。 我尝试了服务类型 simple、idle 和 oneshot。

感谢您的帮助! 克里斯

这是我的单位。

[Unit]
Description=Test
After=sshd.service

[Service]
Type=oneshot
ExecStart=/home/max/start.sh start
Restart=no
User=root
SuccessExitStatus=0

[Install]
WantedBy=multi-user.target

这就是状态。

Loaded: loaded (/etc/systemd/system/test.service; enabled)
Active: inactive (dead) since Die 2016-02-23 20:56:59 CET; 20min ago
Process: 1046 ExecStart=/home/max/test.sh start (code=exited, status=0/SUCCESS)

【问题讨论】:

    标签: linux systemd


    【解决方案1】:

    尽管像下面这样将KillMode 更改为process 将适用于您的情况,但这不是推荐的解决方案。

    [Service]
    KillMode=process
    ...
    

    KillMode 设置为process 的问题是systemd 失去了对其启动进程的所有子进程的控制。这意味着,如果发生任何事情并且您的某个进程由于某种原因没有终止,它将继续徘徊。

    根据您的情况,更好的解决方案是创建所有进程,keep their pid,然后在它们上创建wait

    您在 shell 脚本中使用的等待命令可能会因您使用的 shell 而异(我建议的链接适用于 bash)。让 shell 脚本等待所有子进程实际上与在前台启动一个不会分离的子进程相同。

    或多或少是这样的:

    #!/bin/bash
    
    # Start your various processes
    process1 &
    PROCESS1_PID=$!
    process2 &
    PROCESS2_PID=$!
    process3 &
    PROCESS3_PID=$!
    
    # Wait on your processes
    wait $PROCESS1_PID $PROCESS2_PID $PROCESS3_PID
    
    # OR, if I'm correct, bash also allows you to wait on all children
    # with just a plain wait like so:
    wait
    
    # reach here only after children 1, 2, and 3 died
    

    【讨论】:

      【解决方案2】:

      当 start.sh 完成时,systemd 会杀死与 start.sh 相同的 cgroup 中的所有内容

      您的选择是:

      • 在 Unit 部分设置 KillMode 以处理(默认为控制组)。这将导致 systemd 只杀死它直接触发的进程。

      • 不要让 start.sh 在后台启动并退出,而是在前台执行它

      我认为在您的情况下,选项 2 可行且更直接。

      来源:https://unix.stackexchange.com/a/231201/45329

      【讨论】:

      • 问题是脚本需要启动多个进程。并且全部并行运行。我试图让我的示例保持简单,所以我没有提及它。
      猜你喜欢
      • 1970-01-01
      • 2016-04-09
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 2020-09-06
      • 2015-08-22
      • 2020-07-01
      相关资源
      最近更新 更多