私の解決策 (これまでのところ) は、共通セッションから pam_systemd.so にコメントすることでした。すべてが制御グループなしで system.slice で実行されます。その影響についてはまだわかりませんが、少なくとも実行され、実行され続け、正常にシャットダウンされます。
当社のソフトウェアは社内で開発され、SLES 上で実行されます。これは、java、oracle、sysadmin 用の tomcat Web ページなどです。これらすべてのプロセスを開始するスクリプトを使用しています。systemd まではうまく機能していました。
「env」スクリプトは構成ファイルから情報を収集し、他のスクリプトを呼び出して Java、Oracle などを起動します。これらの他のスクリプトは「oracle」などのユーザーに「su」します。
この「env」スクリプト用のユニットがあり、動作を開始します。「systemctl stop env」を実行すると、停止が機能します。
私の問題は、再起動時に最初にすべてのユーザーが強制終了され、すべての DB、Java プロセスなどが強制終了されることです。DB は実際には適切に停止されていないため、基本的にクラッシュします。その後、停止が実行されようとしますが、物がダウンしているため実行できません。
KillUserProcesses=no、enable-linger、KillExcludeUsers=、systemd-run --scope を追加しようとしましたが、それでも強制終了されます。
systemd が再起動時にユーザーを insta kill しないようにする方法はありますか、またはすべてのサブスクリプトのユニットを把握する必要がありますか?
以下は問題を再現するためのものであり、実際に実行されているスクリプトではありません。
SLES12SP2(systemd 228)で以下を使用して複製できました。Arch マシンを構築しましたが、キルは行われませんでした。
私が気付いた違いの 1 つは、スリープ 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
そしてアーチ上:
└─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