Удаление таймера, созданного с помощью “systemd-run –on-calendar”

Вопрос или проблема

Я создал задачу systemd, используя systemd-run --on-calendar .... Теперь я заменил её на правильные файлы .timer и .service, но не могу удалить старую. Я могу её остановить и отключить, но когда я вызываю systemctl list-timers, она всё равно появляется со своим произвольным именем run-r0d0dc22.... Я также искал её файл .timer, но не смог его найти.

Временные файлы заканчиваются в /run/user/ и, похоже, никогда не удаляются, пока пользователь не выйдет из системы (для systemd-run --user) или до перезагрузки, когда /run воссоздаётся.

Например, если вы создадите команду для однократного выполнения в указанное время:

systemd-run --user --on-calendar '2017-08-12 14:46' /bin/bash -c 'echo done >/tmp/done'

Вы получите файлы, принадлежащие вам, в /run:

/run/user/1000/systemd/user/run-28810.service
/run/user/1000/systemd/user/run-28810.service.d/50-Description.conf
/run/user/1000/systemd/user/run-28810.service.d/50-ExecStart.conf
/run/user/1000/systemd/user/run-28810.timer
/run/user/1000/systemd/user/run-28810.timer.d/50-Description.conf
/run/user/1000/systemd/user/run-28810.timer.d/50-OnCalendar.conf

Для не --user файлы находятся в /run/systemd/system/

Вы можете удалить файлы, выполнить systemctl [--user] daemon-reload и тогда list-timers покажет только имя юнита с его последней историей, если он уже выполнялся. Эта информация, вероятно, хранится во внутренних статусах или журналах systemd.

Принятый ответ (удалить файлы и выполнить daemon-reload) не сработал для меня – вместо этого я смог удалить таймер, используя systemd --user stop unitfile; это может отличаться тем, что я уже использовал файл юнита, тем не менее.


Поскольку мой вопрос «Systemd в качестве замены at» был помечен как «точное дубликат», я удалю его и размещу содержимое ниже.

Я хотел бы использовать systemd как at. Я создал файл юнита в ~/.config/systemd/user/[email protected], который запускает shell-скрипт (передавая “%I”), но у меня есть проблемы с его планированием. Если я использую systemd-run --user --unit say@'test message' --on-calendar="13:54", таймер остаётся активным для выполнения завтра также, вместо того чтобы удалиться после выполнения.

Как мне указать systemd выполнить файл юнита ровно один раз в конкретное время сегодня? Я хотел бы решение, которое автоматически очищает временный таймер, чтобы мне не пришлось после этого выполнять systemd --user stop say@'test message'.


Ответ: мне пришлось указать полную дату. Итак – ... --on-calendar="2018-04-16 13:54:00". Это, похоже, также правильно очищает после себя.

Мне пришлось выполнить

systemctl --user stop Remove_Me.{service,timer}

с версией systemd 245, чтобы удалить временный единичный таймер.

Часть {service,timer} является функцией Bash: расширение фигурных скобок


Ответ Iiridayn на запуск systemctl --user stop Remove_Me не сработал для меня, я получил это:

Предупреждение: Остановка Remove_Me.service, но его все еще можно активировать через:
Remove_Me.timer

и юнит по-прежнему отображался с systemctl --user list-timers *Remove*.

Читая ответ meuh, я нашёл файлы .timer и .service в /run/user/1000/systemd/transient/. После их удаления и выполнения systemctl --user daemon-reload всё ещё оставался Remove_Me.timer (но не Remove_Me.service) в выводе systemctl --user list-timers.

Я избавился от этого задерживающего таймера, повторно добавив юнит с помощью

systemd-run --user --on-calendar=2025-01-01 -u "Remove_Me" touch ~/test_file

а затем удалил его с помощью

systemctl --user stop Remove_Me.{service,timer}

Теперь systemctl --user list-timers *Remove* не показывает никаких единиц.

systemctl stop unit_name.timer

Это отменит ваш systemd-run --on-calendar ...., как указано в вопросе.
В частности, это отменит systemd-run --on-calendar "@$my_epoch_seconds" --unit=unit_name my_command --my --flags.

Ответ или решение

Удаление таймера, созданного с помощью "systemd-run –on-calendar"

Если вы использовали команду systemd-run --on-calendar ... для создания временной задачи в системе systemd и затем заменили её на постоянные файлы .timer и .service, но всё ещё видите старый таймер с произвольным именем (например, run-r0d0dc22...) в списке таймеров, это может вызвать некоторые затруднения. Важно понимать, как управлять временными единицами systemd и как правильно их удалять. Этот процесс включает несколько шагов, которые мы сейчас рассмотрим.

Шаг 1: Остановка и отключение таймера

Запустите команды для остановки и отключения вашего таймера. Это можно сделать с помощью следующих команд:

systemctl --user stop имя_вашего_таймера.timer
systemctl --user disable имя_вашего_таймера.timer

Эти команды остановят выполнение как самого таймера, так и соответствующей службы, но не удалят информацию о них из systemd.

Шаг 2: Поиск временных файлов

Как упоминалось в вашем описании, временные файлы, созданные с помощью systemd-run --user, хранятся в каталоге /run/user/<UID>/systemd/user/.

Для пользователя с UID 1000, эти файлы будут находиться по следующему пути:

/run/user/1000/systemd/user/

Проверьте наличие файлов таймера и службы:

ls /run/user/1000/systemd/user/

Шаг 3: Удаление временных файлов

Если вы обнаружите файлы таймера в директории, вы можете удалить их вручную. Например:

rm /run/user/1000/systemd/user/run-28810.service
rm /run/user/1000/systemd/user/run-28810.timer

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

Шаг 4: Перезагрузка демона systemd

После удаления файлов, для того чтобы systemd не продолжал отслеживать старый таймер, выполните команду перезагрузки демона:

systemctl --user daemon-reload

Шаг 5: Проверка статуса таймера

Теперь вы можете снова проверить, есть ли оставшиеся записи о таймере с помощью:

systemctl --user list-timers

Если все шаги выполнены корректно, в списке не должно быть никаких ранее созданных таймеров.

Альтернативный метод удаления

Если вы всё ещё видите таймер после выполнения всех указанных выше шагов, попробуйте следующее:

  1. Повторно добавьте таймер, используя ту же команду, которую вы использовали ранее с systemd-run, но измените время его выполнения, например:

    systemd-run --user --on-calendar=2025-01-01 -u "Remove_Me" /bin/true
  2. Затем выполните команды для остановки и отключения вновь созданного таймера и службы:

    systemctl --user stop Remove_Me.{service,timer}

Таким образом, использование systemctl stop с группировкой {service,timer} позволяет вам удалять как таймер, так и службу одновременно.

Заключение

Системный менеджер systemd предоставляет мощные возможности для планирования и запуска задач, но важно правильно управлять временными единицами, созданными с помощью systemd-run. Следуя предложенным шагам, вы сможете эффективно удалить ненужные таймеры и предотвратить их повторное появление. Подходите к процессу с осторожностью, и вы получите полное управление над вашими системными задачами.

Оцените материал
Добавить комментарий

Капча загружается...