Команда расписания для запуска в определенную временную метку с помощью systemd

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

Попробуйте запустить gsettings set org.gnome.desktop.background show-desktop-icons falseв своем терминале и посмотрите, отображается ли этот пустой экран.

Это не отвечает вашему желанию сделать Ranger основным файловым менеджером, хотя этот вопрос AskUbuntu кажется уместным.

2
23.11.2019, 16:58
1 ответ

systemd-run может запланировать запуск команды в определенное время, до тех пор, пока:

  • система не выключается до этого времени, потому что она записывает временный файл таймера и службы в /run, который очищается при перезагрузке, и
  • система не приостанавливается в течение этого определенного времени, если только вы не используете параметр «WakeSystem» (, см. ниже ).

См. еще ниже для постоянной перезагрузки -.

Простой пример дляsystemd-run:

# generate an arbitrary timestamp, in seconds-since-the-epoch
timestamp=$(date -d 'now + 42 seconds' +%s)
systemd-run --on-calendar "$(date -d @"$timestamp" +'%F %T')" \
  --timer-property=AccuracySec=1us \
  touch /tmp/done

Важные части, чтобы заставить systemd-runиспользовать секунды -, поскольку -временная метка эпохи -:

  • для использования --on-calendarи
  • здесь, используя дату GNU для преобразования секунд -с -метки времени эпохи в формат, который systemd-runпонимает. Вы можете ввести или преобразовать отметку времени самостоятельно, если результат будет в формате , который OnCalendar понимает .

Текущая документация для OnCalendar указывает, что он напрямую поддерживает ввод в секундах -, начиная с -метки времени эпохи -. Эта поддержка '@seconds' была добавлена ​​в systemd версии 234(ищите на этой странице файлsrc/basic/calendarspec.ccommit d80e5b7 . Ваша версия systemd может предшествовать этому изменению; например:

  • RHEL 7 начинался с systemd 208 и позже был обновлен до версии 219; RHEL 8 использует версию 239(ref ).
  • В Debian 8 использовалась версия 215, в Debian 9 использовалась версия 232, а в Debian 10 использовалась версия 241(ref).
  • Ubuntu 16.04 LTS имела версию 229, Ubuntu 17.10 — версию 234, а Ubuntu 18.04 LTS — версию 237(ref).

С новой -достаточной версией systemd вы можете использовать этот вызов:

timestamp=$(date -d 'now + 42 seconds' +%s)
systemd-run --on-calendar "@${timestamp}" \
  --timer-property=AccuracySec=1us \
  touch /tmp/done

Я также показал свойство таймера -AccuracySec , которое по умолчанию равно 1 минуте,и значение которого вы должны настроить на основе документации:

To optimize power consumption, make sure to set this value as high as possible and as low as necessary.

Я не проверял это, но есть также опция таймера, называемая WakeSystem, которая:

cause the system to resume from suspend, should it be suspended and if the system supports this. Note that this option will only make sure the system resumes on the appropriate times, it will not take care of suspending it again after any work that is to be done is finished.

Вы бы интегрировали его в вышеприведенное вот так:

timestamp=$(date -d 'now + 42 seconds' +%s)
systemd-run --on-calendar "$(date -d @"$timestamp" +'%F %T')" \
  --timer-property=AccuracySec=1us \
  --timer-property=WakeSystem=true \
  touch /tmp/done

Чтобы попросить systemd выполнить команду в определенное время таким образом, чтобы это сохранялось после перезагрузки и не зависело от какого-либо конкретного сеанса входа в систему, вам необходимо разместить таймер и сервисный модуль. файлы под /etc/systemd/system/. /etc/systemd/system — это место, где хранится локальная конфигурация для systemd.

Пример файла таймера::

[Timer]
AccuracySec=1us
[Unit]
Description=2020-01-22 09:50:00 timer
[Timer]
OnCalendar=2020-01-22 09:50:00

и пример файла службы будет:

[Unit]
Description=my 2020-01-22 09:50:00 service
[Service]
ExecStart=
ExecStart=@/usr/bin/bash "/usr/bin/bash" "-c" "echo 2020-01-22 09:50:00 timer and service ran > /tmp/done"

Затем вы должны сообщить systemd о файлах, перезагрузив его:

systemctl daemon-reload

... и включение таймера:

systemctl enable foo.timer

... и затем запуск таймера:

systemctl start foo.timer

Вы можете периодически удалять просроченные таймеры и служебные единицы из /etc/systemd/system по истечении их времени.

3
27.01.2020, 22:07

Теги

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