Остановить службу systemd перед приостановкой, запустить снова после возобновления работы

Это может работать следующим образом.

past=$(date +%Y%m%d%H%M%S -d ${now} -d "-5minutes")
1
17.11.2020, 00:19
1 ответ

Потребность в After=или Before=можно, наконец, увидеть в примерах из archlinux(замечательный источник помощи, как обычно ). Основываясь на этой ссылке, есть два решения для запуска команды при приостановке и возобновлении.

Один из методов заключается в использовании двух единиц, скажем, mysyssuspendи mysysresume. Следующие примеры просто запускают команду dateдля системного журнала, чтобы мы могли видеть, когда они активируются:

/etc/systemd/system/mysyssuspend.service

[Unit]
Before=suspend.target
[Service]
Type=simple
StandardOutput=syslog
ExecStart=/bin/date +'mysyssuspend start %%H:%%M:%%S'
[Install]
WantedBy=suspend.target

/etc/systemd/system/mysysresume.service

[Unit]
After=suspend.target
[Service]
Type=simple
StandardOutput=syslog
ExecStart=/bin/date +'mysysresume start %%H:%%M:%%S'
[Install]
WantedBy=suspend.target

Как обычно, выполните systemctl daemon-reloadи systemctl enable mysyssuspend mysysresumeпосле создания юнит-файлов.

Первый модуль Beforeзависит от цели приостановки и запускается, когда компьютер входит в приостановку. Второй модуль также имеет зависимость Afterи запускается при возобновлении работы.

Другой метод помещает все команды в один блок :/etc/systemd/system/mysuspendresume.service

[Unit]
Before=sleep.target
StopWhenUnneeded=yes
[Service]
Type=oneshot
StandardOutput=syslog
RemainAfterExit=yes
ExecStart=/bin/date +'mysuspendresume start %%H:%%M:%%S'
ExecStop=/bin/date +'mysuspendresume stop %%H:%%M:%%S'
[Install]
WantedBy=sleep.target

Это работает с StopWhenUnneeded=yes, поэтому служба останавливается, когда в ней нет активных служб. Цель сна также имеет StopWhenUnneeded, поэтому, когда она будет завершена, она запустит ExecStopнашего модуля. RemainAfterExitнужен для того, чтобы наш юнит оставался активным даже после завершения ExecStart.

Я проверил оба этих метода на Ubuntu 18.04.5 с systemd версии 237, и оба они работают правильно.


Вместо того, чтобы пытаться объединить ваше требование с вышеуказанными рабочими механизмами, вероятно, более прагматично использовать один из них для остановки/запуска независимого модуля. Например, используйте второй способ и добавьте службу mylongrun:

.

/etc/systemd/system/mysuspendresume.service

[Unit]
Before=sleep.target
StopWhenUnneeded=yes
[Service]
Type=oneshot
StandardOutput=syslog
RemainAfterExit=yes
ExecStart=-/bin/date +'my1 %%H:%%M:%%S' ; /bin/systemctl stop mylongrun ; /bin/date +'my2 %%H:%%M:%%S'
ExecStop=-/bin/date +'my3 %%H:%%M:%%S' ; /bin/systemctl start mylongrun ; /bin/date +'my4 %%H:%%M:%%S'
[Install]
WantedBy=sleep.target

/etc/systemd/system/mylongrun.service

[Unit]
Description=Long Run
[Service]
Type=simple
StandardOutput=syslog
ExecStart=/bin/bash -c 'date +"my11 %%H:%%M:%%S"; while sleep 2; do date +"my12 %%H:%%M:%%S"; done'
ExecStop=/bin/bash -c 'date +"my13 %%H:%%M:%%S"; sleep 10; date +"my14 %%H:%%M:%%S"'
[Install]
WantedBy=multi-user.target

Тестирование путем запуска mylongrunи закрытия крышки дает следующие записи в журнале:

09:29:19 bash[3626]: my12 09:29:19
09:29:21 bash[3626]: my12 09:29:21
09:29:22 systemd-logind[803]: Lid closed.
09:29:22 systemd-logind[803]: Suspending...
09:29:22 date[3709]: my1 09:29:22
09:29:22 systemd[1]: Stopping Long Run...
09:29:22 bash[3715]: my13 09:29:22
09:29:23 bash[3626]: my12 09:29:23
09:29:25 bash[3626]: my12 09:29:25
09:29:27 bash[3626]: my12 09:29:27
09:29:29 bash[3626]: my12 09:29:29
09:29:31 bash[3626]: my12 09:29:31
09:29:32 bash[3715]: my14 09:29:32
09:29:32 systemd[1]: Stopped Long Run.
09:29:32 date[3729]: my2 09:29:32
09:29:32 systemd[1]: Reached target Sleep.
09:29:33 systemd[1]: Starting Suspend...

Мы видим, что длительная команда остановки(sleep 10)выполнена правильно. При возобновлении команда длительного выполнения запускается снова :

.
09:35:12 systemd[1]: Stopped target Sleep.
09:35:12 systemd[1]: mysuspendresume.service: Unit not needed anymore. Stopping.
09:35:12 systemd[1]: Reached target Suspend.
09:35:12 date[3813]: my3 09:35:12
09:35:12 systemd[1]: Started Long Run.
09:35:12 date[3817]: my4 09:35:12
09:35:12 bash[3816]: my11 09:35:12
09:35:14 bash[3816]: my12 09:35:14
09:35:16 bash[3816]: my12 09:35:16
09:35:18 bash[3816]: my12 09:35:18
6
18.03.2021, 22:49

Теги

Похожие вопросы