私の解決策(これまでのところ)は、common-sessionからpam_systemd.soにコメントすることでした。 すべてが制御グループのないsystem.sliceで実行されます。私はまだそのことの影響は確かではありませんが、少なくとも実行されているもの、実行中のもの、そしてシャットダウンをきれいにするものがあります。再起動時にシステムスライスがkillされるのを防ぐ
当社のソフトウェアは、社内で開発され、SLES上で実行されます。 これはjava、oracle、sysadminのtomcat Webページなどです。 これらのプロセスをすべて開始するスクリプトを使用しています。 systemdまで素晴らしい仕事をしています。
"env"スクリプトは、設定ファイルから情報を収集し、java、oracleなどを起動するために他のスクリプトを呼び出します。これらの他のスクリプト "su"は "oracle"のようにユーザに送信されます。
私はこの "env"スクリプトのためのユニットを持っており、起動します。私が "systemctl stop env"を実行すると、Stopが動作します。
私の問題は、リブートするとまず最初にすべてのユーザーが殺され、すべてのDB、Javaプロセスなどです。実際にはうまく停止していないので、基本的にDBをクラッシュさせます。 その後、停止が実行しようとすると、物事がダウンしているためできません。
私は、KillUserProcesses = no、enable-linger、KillExcludeUsers =、systemd-run --scopeを追加しようとしましたが、それらはまだ殺されます。
システムを再起動してもシステムを停止させたり、すべてのサブスクリプトの単位を計算しなくて済むような方法はありますか?
以下の内容は、実際のスクリプトの実行ではなく、問題を再現するためのものです。
私はSLES12SP2(systemd 228)の下でそれを複製することができました。 私はArchマシンを作りましたが、それは殺されませんでした。
私が気づいたことの1つは、スリープ600がsles12のユーザースライスでしたが、アーチのシステムスライスでした。 SLES12上
にsystemd-CGLS:
`-user.slice
|-user-1000.slice
| |[email protected]
| | `-init.scope
| | |-1362 /usr/lib/systemd/systemd --user
| | `-1371 (sd-pam)
| `-session-c1.scope
| `-1383 sleep 600
とアーチ上:
└─system.slice
├─env.service
│ └─276 sleep 600
ユーザーのスライスとセッションがさえアーチ上の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
サービスファイルを投稿できますか?あなたが何か変わったことをしているように私に聞こえる – nir0s