Як зупинити скрипт у визначений час, поки його не запустить знову за допомогою cron?


12

У мене є Raspberry Pi під керуванням OSMC (на базі Debian).

Я встановив завдання cron, щоб запустити сценарій, sync.sh, опівночі.

0 0 * * * /usr/local/bin sync.sh

Мені потрібно зупинити сценарій о 7 ранку. В даний час я використовую:

0 7 * * * shutdown -r now

Чи є кращий спосіб? Я відчуваю, що перезавантаження є надмірним.

Дякую

Відповіді:


25

Ви можете запустити його timeoutкомандою ,

timeout - run a command with a time limit

Synopsis
timeout [OPTION] NUMBER[SUFFIX] COMMAND [ARG]...
timeout [OPTION]
Description

Start COMMAND, and kill it if still running after NUMBER seconds. SUFFIX may be 's' for seconds (the default), 'm' for minutes, 'h' for hours or 'd' for days. 

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


Моє підключення до Інтернету повільне, тому синхронізація займає стільки часу. Ви б рекомендували якийсь конкретний сигнал?
Антоній

@Anthony як зараз синхронізувати?
Рабін



@Anthony можна спробувати інший додаток, як syncthing ( syncthing.net ) або BTSync ( resilio.com ), який працює на рівні блоку для синхронізації
Рабін

9

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

0 0 * * * killall -CONT -g sync.sh || /usr/local/bin/sync.sh
7 0 * * * killall -STOP -g sync.sh

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

0 0 * * * exec /usr/local/bin/sync.sh
7 0 * * * killall -TERM -g sync.sh

Якщо ваша синхронізація або її підзадачі ігнорують сигнали, але не залишають сміття, зробіть це

0 0 * * * exec /usr/local/bin/sync.sh
7 0 * * * killall -KILL -g sync.sh

killallpsmisc


Я використовую сценарій, знайдений нижче, з дзеркалом -c, здається, не проти перезапустити. Що з вищезазначеного ви б рекомендували ?: gist.github.com/feralhosting/4e7e93a7fecd8f55cb4a
Антоній

Бачачи, що LFTP-скрипт, який хоче SIGTERM очистити свій файл блокування, і врахувавши ймовірність таймаутів сервера на 17 холостих годин або ще гірше перенарахування inet [64], я б пішов на 0 0 * * * timeout 7h /usr/local/bin/sync.shабо мій еквівалентний killall -TERMваріант.
Роман Чиборра

4

Я б також застосував cron для "зупинки" або "вбивства" тієї служби чи сценарію у визначений час.
Спочатку створіть свою роботу cron, щоб запустити свою роботу або сценарій. (ви можете легко запустити ще один крон, який знищить роботу, яка має ім'я sudo pkill wget)

По-друге, ви хочете побачити запущені завдання crontab у корисному та читаному форматі на виході:

   ps -o pid,sess,cmd afx | egrep "( |/)cron( -f)?$"

Вони з’являться в перших рядках, приблизно так:

1108  1108 cron
4288  1108 \_ CRON
4289  4289     \_ /bin/sh -c /path/to/my/crontab/script1.sh
4290  4289         \_ /bin/bash /path/to/my/crontab/script1.sh
4295  4289             \_ /usr/bin/wget LINK

Перший стовпець - PID, другий - ідентифікатор сесії, третій - команда, запущена cron. Ви можете знищити всі процеси, пов'язані з конкретною задачею cron, використовуючи ідентифікатор сесії, тому у наведеному вище прикладі слід вбити ідентифікатор сесії 4289:

   pkill -s 4289

Потрібно помістити pkill у сценарій та запустити це як cron


Чи змінюватиметься ідентифікатор сеансу щоразу, коли виконується завдання Cron? А як бути після вимкнення та включення?
Антоній

так, це зміниться. Але якщо ви його скриптуєте, ви можете отримати PID і помістити його в змінну. Ви можете просто використовувати ім'я, якщо воно з'явиться. pkill sync.sh
ddlingo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.