Остановить 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 как-то игнорировать или откладывать убийство пользовательских сессий.

Другие вопросы по тегам