systemd:SIGTERM启动后立即启动

时间:2016-02-23 20:22:07

标签: linux systemd

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

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

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

如果我让它从systemd开始,P会在启动后立即获得SIGTERM并终止。

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

也许我的单位错了,但我不知道如何根据我的需要设置它。 我尝试过service-type 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)

2 个答案:

答案 0 :(得分:4)

当start.sh完成时,systemd会杀死与start.sh

相同的cgroup中的所有内容

您的选择是:

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

  • 不启动start.sh在后台启动并退出但在前台执行它

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

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

答案 1 :(得分:4)

虽然将KillMode更改为process如下所示适用于您的情况,但这不是推荐的解决方案。

[Service]
KillMode=process
...

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

在您的情况下,更好的解决方案是创建所有流程,keep their pid,然后wait

您在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