- Вопрос или проблема
- Ответ или решение
- Удаление таймера, созданного с помощью "systemd-run –on-calendar"
- Шаг 1: Остановка и отключение таймера
- Шаг 2: Поиск временных файлов
- Шаг 3: Удаление временных файлов
- Шаг 4: Перезагрузка демона systemd
- Шаг 5: Проверка статуса таймера
- Альтернативный метод удаления
- Заключение
Вопрос или проблема
Я создал задачу 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
Если все шаги выполнены корректно, в списке не должно быть никаких ранее созданных таймеров.
Альтернативный метод удаления
Если вы всё ещё видите таймер после выполнения всех указанных выше шагов, попробуйте следующее:
-
Повторно добавьте таймер, используя ту же команду, которую вы использовали ранее с
systemd-run
, но измените время его выполнения, например:systemd-run --user --on-calendar=2025-01-01 -u "Remove_Me" /bin/true
-
Затем выполните команды для остановки и отключения вновь созданного таймера и службы:
systemctl --user stop Remove_Me.{service,timer}
Таким образом, использование systemctl stop
с группировкой {service,timer}
позволяет вам удалять как таймер, так и службу одновременно.
Заключение
Системный менеджер systemd предоставляет мощные возможности для планирования и запуска задач, но важно правильно управлять временными единицами, созданными с помощью systemd-run
. Следуя предложенным шагам, вы сможете эффективно удалить ненужные таймеры и предотвратить их повторное появление. Подходите к процессу с осторожностью, и вы получите полное управление над вашими системными задачами.