阻止systemd在重启时终止用户切片

时间:2017-03-20 20:40:38

标签: systemd sles

我的解决方案(到目前为止)是从common-session评论pam_systemd.so。 一切都在system.slice中运行,没有控制组。我不确定它的影响,但至少会运行,保持运行,并干净地关闭。

我们的软件在内部开发并在SLES上运行。 它是java,oracle,sysadmin等的tomcat网页。 我们有一个我们一直在使用的脚本,它启动了所有这些过程。 一直很好,直到systemd。

“env”脚本从配置文件中收集信息,然后调用其他脚本来启动java,oracle等。这些其他脚本“su”给用户,如“oracle”。

我有一个单元用于这个“env”脚本并开始工作。如果我运行“systemctl stop env”,则停止工作。

我的问题是,在重新启动时,第一件事是所有用户都被杀死所有的数据库,java进程等等。基本上崩溃了数据库,因为它们确实没有很好地停止。 然后停止试图运行而不能,因为东西已经停止。

我曾尝试添加KillUserProcesses = no,enable-linger,KillExcludeUsers =,systemd-run --scope,但它们仍然会被杀死。

有没有办法在重新启动时让systemd NOT insta-kill用户或者我不得不计算出所有子脚本的单位?

下面的内容只是为了复制问题 - 而不是实际运行的脚本。

我能够在下面的SLES12SP2(systemd 228)上复制它。 我建造了一台拱形机器,并没有杀死它。

我注意到的一点是不同的是,睡眠600是sles12上的用户切片,而是拱形上的系统切片。

SLES12上的systemd-cgls:

`-user.slice
  |-user-1000.slice
  | |-user@1000.service
  | | `-init.scope
  | |   |-1362 /usr/lib/systemd/systemd --user
  | |   `-1371 (sd-pam)                                                          
  | `-session-c1.scope
  |   `-1383 sleep 600

和Arch:

└─system.slice
  ├─env.service
  │ └─276 sleep 600

甚至没有使用Arch上的su创建用户切片和会话。

我的服务文件:

[Unit]
Description=Starts and stops applications needed for an environment
Wants=network.target httpd.service
After=network.target httpd.service sshd.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/pro/bin/sys/services/envStart.sh start
ExecStop=/pro/bin/sys/services/envStart.sh stop
ExecReload=/pro/bin/sys/services/envStart.sh restart
TimeoutSec=3600

[Install]
WantedBy=multi-user.target

envStart脚本:

#!/bin/bash

case $1 in
    start)
        /pro/bin/sys/services/sleep.sh start
    ;;
    stop)
        /pro/bin/sys/services/sleep.sh stop
    ;;
esac

和睡眠脚本:

#!/bin/bash

case $1 in
    start)
        echo "starting sleep"
        su sleepuser -c "sleep 600 &"
    ;;
    stop)
        echo "stopping sleep"
        sleep 300
    ;;
esac

3 个答案:

答案 0 :(得分:1)

我有相同/相似的问题。对我来说,是用户切换是问题所在,导致所有进程都在user.slice中启动,而不是在system.slice中启动。 显然,在user.slice和systemd中,没有任何“重要的”东西正在运行。在关机/重启时,slice和systemd只会杀死那里的所有(?)进程。 我通过删除启动脚本中的所有用户开关(su / sudo)并在单位文件(User = xxx)中使用user指令解决了该问题。

答案 1 :(得分:0)

我的解决方案(到目前为止)是从common-session评论pam_systemd.so。一切都在system.slice中运行,没有控制组。我不确定它的影响,但至少会运行,保持运行,并干净地关闭。

答案 2 :(得分:0)

不幸的是,我仍然遇到同样的问题。

我的调查显示,作为使用User = xxx指令的替代方法,该脚本可以使用“ runuser”代替“ sudo”和“ su”,因为这是绕过PAM IIUC的“ su”实现。

对于我管理的大多数服务,都可以解决问题。

我希望有一种方法可以告诉systemd以某种方式忽略或延迟终止用户会话。