Остановить systemd от уничтожения пользовательских срезов при перезагрузке
Мое решение (до сих пор) было прокомментировать pam_systemd.so из общего сеанса. Все работает в system.slice без контрольных групп. Я пока не уверен в его влиянии, но, по крайней мере, все работает, продолжайте работать и полностью отключайтесь.
Наше программное обеспечение разработано и работает на SLES. Это java, oracle, веб-страница tomcat для sysadmin и т. Д. У нас есть скрипт, который мы используем, который запускает все эти процессы. Отлично работал до systemd.
Сценарий "env" собирает информацию из конфигурационных файлов и затем вызывает другие сценарии для запуска java, oracle и т. Д. Эти другие сценарии "su" для пользователя похожи на "oracle".
У меня есть блок для этого сценария "env" и начать работу. Остановка работает, если я запускаю "systemctl stop env".
Моя проблема в том, что при перезагрузке первое, что ВСЕ пользователи убиты, равно как и все БД, процесс Java и т. Д. В основном происходит сбой БД, поскольку они действительно не останавливаются. Затем остановка пытается бежать и не может, потому что вещи не работают.
Я попытался добавить KillUserProcesses= нет, enable-linger, KillExcludeUsers=, systemd-run --scope, и они все еще убиты.
Есть ли способ заставить systemd НЕ инсталлировать пользователей при перезагрузке или я застрял в необходимости выяснить единицы измерения для всех вспомогательных сценариев?
Приведенный ниже материал предназначен только для того, чтобы повторить проблему, а не из-за реальных скриптов.
Я был в состоянии повторить это с ниже на SLES12SP2 (systemd 228). Я построил машину Арка, и она не убивала.
Одна вещь, которую я заметил, отличалась тем, что sleep 600 был пользовательским срезом на sles12, но системным срезом на arch.
systemd-cgls на SLES12:
`-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
Пользовательский срез и сессия даже не создаются с su на Arch.
Мой сервисный файл:
[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
4 ответа
У меня была такая же / похожая проблема. Для меня проблема заключалась в переключении пользователя, из-за которого все процессы запускались в user.slice, а не в system.slice. По-видимому, в user.slice не должно выполняться ничего "важного", а systemd просто убивает все (?) Процессы там при завершении работы / перезагрузке. Я решил это, удалив все пользовательские переключатели (su/sudo) в моих сценариях запуска и используя директиву пользователя в файле модуля (User=xxx).
Мое решение (до сих пор) было прокомментировать pam_systemd.so из общего сеанса. Все работает в system.slice без контрольных групп. Я пока не уверен в его влиянии, но, по крайней мере, все работает, продолжайте работать и полностью отключайтесь.
Я бы хотел, чтобы был способ сказать systemd игнорировать или отложить уничтожение пользовательских сессий каким-то образом.
Да, используя SendSIGKILL=no, но здесь проблема не в том, что systemd убивает процесс, во время перезапуска ОС ядро убивает весь процесс пользовательского фрагмента. Поэтому, чтобы избежать, просто обновите свой скрипт, чтобы переместить весь процесс из пользовательского слайса в системный слайс перед перезагрузкой (/sys/fs/cgroup/systemd/system.slice//tasks>). Надеюсь, поможет. Спасибо!
К сожалению, я все еще сталкиваюсь с той же проблемой.
Мое расследование показывает, что в качестве альтернативы использованию директивы User=xxx сценарий может использовать "runuser" вместо "sudo" и "su", поскольку это реализация "su", которая обходит PAM IIUC.
Для большинства служб, которыми я управляю, это помогает.
Хотелось бы, чтобы был способ сказать systemd как-то игнорировать или откладывать убийство пользовательских сессий.