systemd:SIGTERM DIREKT开始至关重大

问题描述 投票:4回答:2

我想systemd首次。我要开始在系统引导的过程。而我在得到它运行起来有问题。

systemd要运行脚本(start.sh)。该脚本将启动一个进程(可以称之为P)在后台与代码清零p退出继续运行,直到永远的信号happends。

如果我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

这就是现状。

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
2个回答
4
投票

当start.sh完成,systemd杀死一切都在同一cgroup中的start.sh

你的选择是:

  • 在单元段设定KillMode处理(默认为控制组)。这将导致systemd只杀死其直接燃烧的过程。
  • 不使start.sh开始在后台的东西和退出,但在前台那里执行它

我想在您的情况选择2是可行的,更简单。

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


4
投票

虽然改变KillModeprocess像下面会在你的情况下工作,它不是推荐的解决方案。

[Service]
KillMode=process
...

KillMode设置为process的问题是,在systemd它开始的过程中所有的孩子都失去了控制。这意味着,如果有什么事情发生,你的流程的一个不出于某种原因死了,它会继续萦绕。

在您的情况更好的解决方案是创建的所有流程,keep their pid,然后对他们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
© www.soinside.com 2019 - 2024. All rights reserved.