Назад | Перейти на главную страницу

Как запускать команды crontab внутри определенных сеансов экрана?

У меня есть crontab, который работает так:

0 0 * * * /execute/shell/script.sh
0 0 * * * /execute/shell/script1.sh
0 0 * * * /execute/shell/script2.sh

И я хочу запускать каждый сценарий на другом экране. Но я хочу, чтобы этот экран оставался включенным, чтобы в любое время, когда я захочу увидеть прогресс одного из этих скриптов, я всегда мог просто сделать screen -d -r <PID> и он снова прикрепит экран, чтобы я мог видеть прогресс.

Я уверен, что должен быть способ сделать это. но аналогичные вопросы, которые я нашел, не дали ответа.

Crontab запустить экран Как использовать crontab для запуска сеанса экрана?

Вы можете попробовать что-то вроде этого:

cat /etc/cron.d/test
*/10 * * * * root screen -dmS script bash -c '/execute/shell/script.sh; exec bash'
*/10 * * * * root screen -dmS script1 bash -c '/execute/shell/script1.sh; exec bash'
*/10 * * * * root screen -dmS script2 bash -c '/execute/shell/script2.sh; exec bash'

Я считаю, что это должно сработать. Конечно, отредактируйте время так, как вам нужно.

Вам действительно нужно взаимодействовать с командами, или вы просто хотите видеть статус до того, как команды будут завершены, а результаты будут отправлены вам по почте?

Я столкнулся с подобной "проблемой", когда я запускал traceroute(8) и mtr из cron, чтобы контролировать подключение, с mtr работает в for-loop для обеспечения более точных измерений в течение заданного интервала (от 5 до 16,67 минут (от 300 до 1000 циклов)), но весь скрипт рассчитан на работу около часа (чтобы гарантировать, что я не получу спама по электронной почте), поэтому , Я хотел видеть статус, как это произошло.

https://unix.stackexchange.com/questions/61820/how-can-i-access-a-deleted-open-file-on-linux-output-of-a-running-crontab-task

Способ cron работает, он создает временный файл в / tmp и сразу вызывает unlink(2) (но все еще сохраняя файл открытым); впоследствии это используется для сохранения вывода ваших скриптов до их завершения и отправляется вам по электронной почте.

Таким образом, вы можете использовать lsof -n -c cron (и / или lsof -n | fgrep cron), чтобы узнать количество открытых файлов, которые были удалены, а затем получить доступ к этим файлам через /proc/$PID/fd/$FD пространство имен, чтобы увидеть вывод ваших скриптов, запущенных из cron, без необходимости screen.

Вышеупомянутый (ответ Ярослава Кучера) не будет работать должным образом, потому что при втором вызове команды будут создавать новые сеансы экрана с теми же именами, что и предыдущие.

Если вы хотите, чтобы для одних и тех же сценариев всегда были одни и те же сеансы экрана, я бы сделал это немного сложнее.

Я бы запустил эти сеансы в @reboot cron со сценариями, которые создают постоянный цикл, например

#!/bin/bash
while true; do
if [ -f /tmp/script1_enabled ]; then
    script1_function_or_command
    rm /tmp/script1_enabled
fi

sleep 60;
done 

Что будет запускать каждую минуту проверки наличия именованного файла в / tmp - если он существует, запустите команду, в противном случае подождите еще минуту.

Вторая часть - это команды cron, которые создают эти файлы каждый день и работают как логический флаг для запуска вызова скрипта.

После того, как сценарий будет готов, файл будет удален. Таким образом, вы можете сохранить одни и те же сеансы для своих скриптов и по-прежнему запускать их с интервалом, который вам нравится.

Если 60-секундная задержка в цикле слишком велика для вас (с помощью этого метода невозможно точно запустить скрипт в заданное время, так как сон будет выполняться в непредсказуемое время), вы можете настроить inotifywait наблюдает и выполняет сценарии сразу после создания файла.

cron будет выглядеть так:

@reboot screen -dmS script1 /usr/local/bin/script1_watcher
@reboot screen -dmS script2 /usr/local/bin/script2_watcher
0 0 * * * touch /tmp/script1_enabled
15 */4 * * * touch /tmp/script2_enabled