LINUX.ORG.RU
решено ФорумAdmin

Зависимости сервисов в systemd

 


0

1

Как сделать, чтобы самописный unit останавливался до того, как остановится сеть? Допустим в Fedora? Сделал такой, а сеть всё равно останавливается до остановки базы.

[Unit]
Description=Run oracle
Wants=network.target
After=network.target


[Service]
Type=oneshot
RemainAfterExit=True
ExecStart=/usr/bin/su - oracle -c 'dbstart $ORACLE_HOME_LISTNER ; lsnrctl start'
ExecStop=/usr/bin/su - oracle -c 'lsnrctl stop ; dbshut $ORACLE_HOME_LISTNER'

[Install]
WantedBy=multi-user.target

Wants=network.target
After=network.target

Всё уже должно быть хорошо. Странно, если это не так.

Чем управляется сеть? Делал ли ты systemctl daemon-reload (как вариант, перезагружался ли) после добавления этих строк?

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Чем управляется сеть? Делал ли ты systemctl daemon-reload (как вариант, перезагружался ли) после добавления этих строк?

Сеть управляется NetworkManager (вроде так по дефолту в Fedora). Перезагружался и не раз. (

При команде reboot моментально прибивает мою ssh сессию.

Вообще судя по логам запускается всё же юнит до остановки сети, вот только система не ждёт его завершения и запускает другие сервисы в т.ч. и отключает сеть.

Rubystar ★★ ()
Последнее исправление: Rubystar (всего исправлений: 2)
Ответ на: комментарий от Rubystar

При команде reboot моментально прибивает мою ssh сессию.

Ну это норм, потому что sshd останавливается одним из первых (и logind киллит все сессии, по идее).

Сеть управляется NetworkManager

В юните NetworkManager написано Before=network.target, так что проблема не во взаимном порядке остановки... Запущенное соединение помечено в NetworkManager как общесистемное?

intelfx ★★★★★ ()
Ответ на: комментарий от Rubystar

На момент начала шатдауна юнит вообще в состоянии «active»?

intelfx ★★★★★ ()

Кстати, несколько комментариев.

dbstart $ORACLE_HOME_LISTNER ; lsnrctl start

По идее, это должны быть два юнита. Один на dbstart, другой (c Requires=<первыйюнит> / After=<первыйюнит>) на lsnrctrl.

Type=oneshot

Точно? А не forking? Из здравого смысла следует, что «dbstart» и «lsnrctl start» запускают процессы базы данных самостоятельно (т. е. они появляются в том же дереве процессов).

/usr/bin/su - oracle -c

User=oracle.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Запущенное соединение помечено в NetworkManager как общесистемное?

Ммм.. А где это?

nm-connection-editor запустил, такого не нашёл.

Rubystar ★★ ()
Ответ на: комментарий от Rubystar

Вкладка «Общий», «Все пользователи могут подключаться к этой сети» (локаль ru_RU, network-manager-applet 0.9.10).

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)

Это на семёрке делаешь?

af5 ★★★★★ ()

Кое-кому пора писать книгу

«Как перестать использовать идеологически неправильные наколенные скрипты, которые работают, и начать использовать идеологически правильный systemd, который не.»

Deleted ()

network.target has very little meaning during start-up. It only indicates that the network management stack is up after it has been reached. Whether any network interfaces are already configured when it is reached is undefined. It's primary purpose is for ordering things properly at shutdown: since the shutdown ordering of units in systemd is the reverse of the startup ordering, any unit that is order After=network.target can be sure that it is stopped before the network is shut down if the system is powered off. This allows services to cleanly terminate connections before going down, instead of abruptly losing connectivity for ongoing connections, leaving them in an undefined state. Note that network.target is a passive unit: you cannot start it directly and it is not pulled in by any services that want to make use of the network. Instead, it is pulled in by the network management service itself. Services using the network should hence simply place an After=network.target dependency in their unit files, and avoid any Wants=network.target or even Requires=network.target.

То есть Wants=network.target лишний, и без него вроде бы должно заработать. Я с дивана если что.

d_a ★★★★★ ()
Ответ на: комментарий от d_a

Wants=network.target лишний

Да, точно. Но в любом случае он никоим образом не мешает.

intelfx ★★★★★ ()
Ответ на: комментарий от intelfx

Переписал юнит следующим образом, вроде теперь база и прослушиватель останавливаются нормально при перезагрузке и выключении. Цель достигнута.

[Unit]
Description=Run oracle
After=network.target

[Service]
EnvironmentFile=-/etc/sysconfig/oracle
Type=oneshot
RemainAfterExit=true
ExecStart=/app/oracle/product/12.1.0/db/bin/dbstart $ORACLE_HOME_LISTNER ; /app/oracle/product/12.1.0/db/bin/lsnrctl start
ExecStop=/app/oracle/product/12.1.0/db/bin/lsnrctl stop ; /app/oracle/product/12.1.0/db/bin/dbshut $ORACLE_HOME_LISTNER
User=oracle

[Install]
WantedBy=multi-user.target

Файл /etc/sysconfig/oracle

ORACLE_BASE=/app/oracle
ORACLE_SID=MYSID
ORACLE_HOME=/app/oracle/product/12.1.0/db
PATH=/app/oracle/product/12.1.0/db/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/oracle/.local/bin:/home/oracle/bin
NLS_LANG=AMERICAN_AMERICA.UTF8

Rubystar ★★ ()
Последнее исправление: Rubystar (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.