systemd:启动后立即发出 SIGTERM

chr*_*s01 6 linux systemd

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

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

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

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

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

也许我的单位有问题,但我不知道如何根据我的需要进行设置。我尝试了服务类型简单、空闲和一次性。

感谢帮助!克里斯

这是我的单位。

[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
Run Code Online (Sandbox Code Playgroud)

这就是状态。

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)
Run Code Online (Sandbox Code Playgroud)

mna*_*gel 5

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

您的选择是:

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

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

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

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


Ale*_*lke 5

尽管将 更改KillModeprocess如下所示将适用于您的情况,但这不是推荐的解决方案。

[Service]
KillMode=process
...
Run Code Online (Sandbox Code Playgroud)

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

在您的情况下,更好的解决方案是创建所有流程,保留它们pid,然后等待它们。

您在 shell 脚本中使用的 wait 命令可能因您使用的 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
Run Code Online (Sandbox Code Playgroud)