我的解决方案(到目前为止)是从 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 在重启时不杀掉用户,或者我不得不找出所有子脚本的单位?
下面的内容只是为了复制问题 - 而不是实际运行的脚本。
我能够在 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
Run Code Online (Sandbox Code Playgroud)
在 Arch 上:
??system.slice
??env.service
? ??276 sleep 600
Run Code Online (Sandbox Code Playgroud)
用户切片和会话甚至不是用 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
Run Code Online (Sandbox Code Playgroud)
envStart 脚本:
#!/bin/bash
case $1 in
start)
/pro/bin/sys/services/sleep.sh start
;;
stop)
/pro/bin/sys/services/sleep.sh stop
;;
esac
Run Code Online (Sandbox Code Playgroud)
和睡眠脚本:
#!/bin/bash
case $1 in
start)
echo "starting sleep"
su sleepuser -c "sleep 600 &"
;;
stop)
echo "stopping sleep"
sleep 300
;;
esac
Run Code Online (Sandbox Code Playgroud)
我的解决方案(到目前为止)是从公共会话中评论 pam_systemd.so 。一切都在 system.slice 中运行,没有对照组。我还不确定这会产生什么影响,但至少事情可以运行,保持运行,并干净地关闭。
| 归档时间: |
|
| 查看次数: |
2004 次 |
| 最近记录: |