Запускайте сценарій кожні 30 хв із системою


20

Я хотів би виконувати сценарій кожні 30 хв після завантаження в систему. Я знаю, що ви можете використовувати cron, але я не планую часто використовувати цю функцію, тому я хотів би спробувати її з systemd.

Поки що я знайшов лише монотонні таймери, які дозволяють щось виконати один раз (принаймні, я так думаю). Як виглядатиме foo.timerі foo@user.serviceяк виглядатиме у випадку, якщо я хотів би що-небудь виконувати щось кожні 30 хвилин від запуску завантаження / системи?

foo@user.service

[Unit]
Description=run foo
Wants=foo.timer

[Service]
User=%I
Type=simple
ExecStart=/bin/bash /home/user/script.sh

foo.timer

[Unit]
Description=run foo

[Timer]
where I am stuck... ???

Відповіді:


26

Вам потрібно створити два файли: один для обслуговування, інший для таймера з тим самим іменем.

приклад:

/etc/systemd/system/test.service

[Unit]
Description=test job

[Service]
Type=oneshot
ExecStart=/bin/bash /tmp/1.sh

/etc/systemd/system/test.timer

[Unit]
Description=test

[Timer]
OnUnitActiveSec=10s
OnBootSec=10s

[Install]
WantedBy=timers.target

після цього перезавантажте systemd за допомогою команди systemctl daemon-reloadта запустіть таймер до systemctl start test.timerабо включіть їх за замовчуванням.

вміст тесту 1.sh

#!/bin/bash
echo `date` >> /tmp/2

І команда перевірити всі доступні таймери: systemctl list-timers --all

Більш детальна інформація про сторінку проекту та приклади на сторінці ArchLinux


systemd приймає сценарії, і вони перераховані, проте нічого не відбувається
TomTom

який? повинно бути два сценарії, один таймер та інший сервіс. Час, коли вони були виконані, можна було перевірити командою list-timers, можливі помилки можна перевірити systemctl status test.timerі systemctl status test.serviceпопередити
Reishin

1
будь ласка, скористайтеся systemctl list-timers --allкомандою і перевірте вихід. Йому потрібно бути таким . Подивіться на одиницю, ліву та пропущені стовпці. Якщо таймер присутній, перегляньте файл вашого сервісу і перевірте наявність помилок, оскільки таймер працює нормально.
Решин

1
ні, головне питання coz нічого не задає про "сповіщення-відправлення", і я думаю, що ми не повинні змішувати дві різні речі, коли така тема вже присутня. у вашому випадку спробуйте додати export DISPLAY=:0.0до сценарію.
Рейшин

1
ps: на думку man systemd.timer, стійкий = true впливає лише на налаштований OnCalendar (тобто настінні годинники)
настінні годинники

11

Ось ще один варіант без використання таймера. Якщо час не є надзвичайно важливим і сценарій не триває, то для простих речей буде добре.

[Unit]
Description=Run foo

[Service]
User=%I
Restart=always
RestartSec=1800s
ExecStart=/bin/bash /home/user/script.sh

2
Мені подобається це рішення. Єдиний головний недолік - це те, що системні журнали будуть заповнені журналами "Starting <service X>", якщо ви перезапускаєтеся часто (тобто кожні 30 секунд). У цей момент може бути краще запустити службу як демон, замість того, щоб перезапускати службу знову і знову з systemd.
jersey bean

Це правда. Швидкий і простий матеріал працює. Але кращим рішенням був би таймер або тривалий сценарій.
Метт H
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.