Linux — Запуск приложения / скрипта с задержкой, после перезагрузки
Периодически возникают ситуации, когда необходимо запустить скрипт или приложение с задержкой спустя некоторое время после включения / перезагрузки системы. Есть несколько способов, можно использовать 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 LEFT LAST 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 2020
|