LINUX.ORG.RU
ФорумAdmin

Запустить таймер перед выключением

 


0

1

Нашёл вот тему, и вроде бы то, что мне надо, но так и не нашёл ответ к ней https://unix.stackexchange.com/questions/396261/systemd-how-to-run-a-job-both-periodically-and-once-at-system-shutdown

Можно ли один и тот же таймер запустить и по календарю и перед выключением средствами systemd? Пока я только пришёл к велосипеду как в той теме, но в ExecStop= прописать systemctl start my-timer.service, чтобы избежать двойного запуска. Есть ли лучший способ?

★★★★★

Я не очень уверен, но похоже надо делать отдельный сервис со строчкой ниже, который будет дублировать основной.

[Unit]
Before=shutdown.target reboot.target halt.target
itn ★★★
()

Ты точно хочешь именно запустить таймер перед выключением, а не запустить некую задачу по таймеру и перед выключением?

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

В предположении, что тебе нужно именно второе, будет достаточно написать сервис и таймер следующего вида:

# /etc/systemd/system/foo.service
[Unit]
DefaultDependencies=no
Requires=basic.target
After=basic.target
Before=shutdown.target
# skip Conflicts=shutdown.target

[Service]
Type=oneshot
#RemainAfterExit=false
ExecStart=/path/to/job

[Install]
Also=foo.timer # этот юнит нужно написать
WantedBy=shutdown.target
# /etc/systemd/system/foo.timer
[Timer]
OnCalendar=...

[Install]
WantedBy=timers.target

Ну и systemctl enable foo.service.

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

В предположении, что тебе нужно именно второе, будет достаточно написать сервис и таймер следующего вида:

Вот я так понимаю, что недостаточно. либо в

ExecStart=/path/to/job

Нужно написать systemctl start timer-based.service. Ибо если я напишу /run-my-backup.sh, есть вероятность, что может быть 2 скрипта при выключении, чего я хочу избежать. А как я понял, если запускать один сервис, то есть гарантия, что они не будут запускаться одновременно.

Либо нужно опять добавить в bash-скрипт flock, который я удалил пару недель назад при миграции с init.

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

Нужно написать systemctl start timer-based.service. Ибо если я напишу /run-my-backup.sh, есть вероятность, что может быть 2 скрипта при выключении, чего я хочу избежать.

С чего бы это?

У тебя есть один *.service с двумя триггерами (по таймеру и по зависимостям). Его при всём желании нельзя запустить два раза одновременно. Вот два раза подряд — вполне можно, но чтобы это решить, нужна дополнительная информация.

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

Пардон, вот это пропустил.

Before=shutdown.target

WantedBy=shutdown.target

Попробую, отпишусь. Спасибо!

Вот два раза подряд — вполне можно

Это не страшно.

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

Так, попробовал разные вариации. Не вызывается он при перезагрузке/выключении. Завтра дальше копать буду.

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

Ты уверен, что сервис, который будет стартовать при выключении, не будет принудительно убиваться системой, или вообще не будет запускаться? Иначе это отличный способ повесить systemd при выключении.

Я не разбираюсь в systemd и он у меня не установлен, но… думаю тут надо менять логику и вместо ExecStart прописать ExecStop, как по ссылке в стартовом сообщении. Заодно указать таймауты

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

Ты уверен, что сервис, который будет стартовать при выключении, не будет принудительно убиваться системой, или вообще не будет запускаться?

Да, уверен. Именно для этого мы задаём зависимости вручную и не указываем Conflicts=shutdown.target.

думаю тут надо менять логику и вместо ExecStart прописать ExecStop, как по ссылке

ТС хочет запускать тот же скрипт по таймеру и сделать так, чтобы два триггера не конфликтовали. Это противоречит такому подходу.

Я не разбираюсь в systemd и он у меня не установлен

Оно и видно.

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

Так, осталось вспомнить, как journald перенаправить в файл, чтобы логи получить…

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

Насколько я понял, прикол в том, что если выключить зависимости, то оно по таймеру может не стартануть. Но у меня оно пока даже при выключении не запускается…

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

Логи вроде перенаправил. Но стартующего сервиса всё равно не вижу… щас буду дальше копать.

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

Не было ничего в логах. Короче работает только сервис с хаком ExecStop (как в стартовой ссылке). Велосипед, блин. Придётся добавлять в скрипт flock(1), а я ведь только его удалил =)

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

Короче чувак в той теме подтвердил то же самое, что и я щас написал. Поэтому я не знаю, как у тебя работает всё в одном service файле.

UVV ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.