【问题标题】:Stop systemd from killing user slices on reboot停止 systemd 在重启时杀死用户切片
【发布时间】:2017-08-12 07:38:28
【问题描述】:

我的解决方案(到目前为止)是从公共会话中评论 pam_systemd.so。 一切都在 system.slice 中运行,没有控制组。我还不确定这会产生什么影响,但至少可以运行、保持运行并干净地关闭。

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

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

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

我的问题是,在重新启动时,第一件事是所有用户都被杀死,所有 DB、Java 进程等也被杀死。基本上使 DB 崩溃,因为它们真的没有很好地停止。 然后停止尝试运行,但因为东西已经关闭而无法运行。

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

有什么方法可以让 systemd 在重新启动时不直接杀死用户,或者我不得不为所有子脚本找出单位?

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

我能够在 SLES12SP2 (systemd 228) 上使用以下内容复制它。 我造了一台 Arch 机器,但它并没有杀人。

我注意到不同的一点是 sleep 600 是 sles12 上的用户切片,但 arch 上的系统切片。

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

【问题讨论】:

  • 您可以发布您的服务文件吗?听起来你在那儿做的很奇怪

标签: systemd sles


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我的解决方案(到目前为止)是从公共会话中评论 pam_systemd.so。一切都在 system.slice 中运行,没有控制组。我还不确定这会产生什么影响,但至少可以运行、保持运行并干净地关闭。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • 不幸的是,我们没有区别。 runuser 的结果与 sudo 相同。
      猜你喜欢
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 2018-05-05
      • 1970-01-01
      • 2019-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多