Периодически возникают ситуации, когда необходимо запустить скрипт или приложение с задержкой спустя некоторое время после включения / перезагрузки системы. Есть несколько способов, можно использовать crontab или systemd.
Отложенный запуск — CRONTAB
Здесь достаточно открыть на редактирование crontab:
1 |
crontab -e |
Указать путь к скрипту / приложению использовав параметры @reboot + sleep:
1 |
@reboot sleep 10 && /path/to/script/check-service.sh nginx >/dev/null 2>&1 |
Из листинга ясно, что по таймауту в 10 секунд произойдет запуск скрипта check-service.sh
Отложенный запуск — SYSTEMD
Здесь можно использовать systemd таймер + systemd юнит, для начала создадим тестовый скрипт, который будет складывать в лог дату и время в момент своего запуска:
1 2 |
#!/bin/bash echo "Run delay script at $(date)" >> /tmp/delay-log |
Тестовый скрипт можно разместить куда угодно, например в /tmp и разрешить его выполнение:
1 |
chmod u+x /tmp/delay.sh |
Создать юнит для запуска скрипта:
1 |
nano /etc/systemd/system/test-delay.service |
С содержимым:
1 2 3 4 5 6 7 |
[Unit] Description=Run script at startup [Service] Type=oneshot ExecStart=/tmp/delay.sh TimeoutStartSec=0 |
Теперь наступило время таймера, смотрим какие есть в принципе:
1 |
systemctl list-timers |
Создаем свой:
1 |
nano /etc/systemd/system/test-delay.timer |
С содержимым:
1 2 3 4 5 6 7 8 |
[Unit] Description="Run script after 3 munutes after boot" [Timer] OnBootSec=3m [Install] WantedBy=default.target |
Где тймаут запуска 3 минуты, после чего необходимо обновить конфигурацию systemd:
1 |
systemctl daemon-reload |
Далее с целью эксперимента выключаем тестовый сервис:
1 |
systemctl disable test-delay.service |
Включаем таймер:
1 |
systemctl enable test-delay.timer |
Проверка
Перезагружаем систему, смотрим состояние таймера:
1 2 3 4 5 6 7 |
systemctl status test-delay.timer ● test-delay.timer - "Run script after 3 munutes after boot" Loaded: loaded (/etc/systemd/system/test-delay.timer; enabled; vendor preset: disabled) Active: active (waiting) since Wed 2020-06-17 12:53:44 +06; 6h ago Trigger: Wed 2020-06-17 18:56:37 +06; 2min 27s left Jun 17 12:53:44 sys-adm.local systemd[1]: Started "Run script after 3 munutes after boot". |
Видно, что до запуска осталось 2 минуты 27 секунд, проверяем список таймеров:
1 2 3 4 |
systemctl list-timers NEXT LEFTLAST PASSED UNIT ACTIVATES Wed 2020-06-17 18:56:37 +06 2min 8s left n/a n/a test-delay.timer test-delay.service ... |
Далее, по факту отведенного времени проверяем лог:
1 |
cat /tmp/delay-log |
1 2 |
cat /tmp/delay-log Run delay script at Wed Jun 17 18:57:09 +06 |
Ваш комментарий будет первым