ATD/пакет: запланировать задачу с пакетной обработкой для выполнения после текущих задач, но перед ожидающими.

Вопрос или проблема

Я регулярно планирую десятки или больше задач с помощью atd/batch на своем linux компьютере. Часто выполнение наборов занимает часы, а иногда и дни. Однако иногда я хочу запустить несколько задач, которые должны занять около 5-10 минут, и мне хотелось бы получить их результаты сегодня, а не, скажем, через три дня.

Поэтому я хотел бы поручить atd дождаться завершения текущей задачи, затем запустить эти конкретные задачи, а затем вернуться к планированию ожидающих. Запуск задач параллельно действительно не вариант, они серьезно мешают друг другу.

Ответ или решение

Для решения вашей задачи по управлению заданиями в Linux с использованием atd и batch, вам потребуется немного нестандартный подход, так как стандартные инструменты не предоставляют прямой возможности для ожидания завершения текущих задач перед выполнением новых. Однако, это можно реализовать с помощью некоторых скриптов и управления процессами.

Вот пример того, как это можно сделать:

Шаг 1: Создайте сценарий для ожидания завершения задач

Создайте скрипт, который будет проверять наличие запущенных заданий и ждать, пока они не завершатся. Назовем его wait_for_completion.sh.

#!/bin/bash

# Проверяем, есть ли запущенные задания
while : ; do
    # Получаем список текущих процессов, связанных с batch или atd
    if ! pgrep -u $USER -f "batch\|atd" > /dev/null; then
        break  # Если нет текущих процессов, выходим из цикла
    fi
    sleep 10  # Ждем 10 секунд перед повторной проверкой
done

Не забудьте сделать этот файл исполняемым:

chmod +x wait_for_completion.sh

Шаг 2: Планируйте выполнение вашего задания

Теперь вы можете использовать созданный вами скрипт в связке с командой batch. Например, чтобы запланировать выполнение вашего задания:

# Запускаем скрипт для ожидания завершения текущих задач
./wait_for_completion.sh &

# После завершения текущих задач, отправляем ваше задание в очередь
echo "ваша_команда" | batch

Ваша задача будет выполнена после завершения всех текущих заданий, однако имейте в виду, что с помощью batch задание будет выполнено только после достижения времени загрузки с минимальной нагрузкой. Для небольших заданий также можно использовать at.

Альтернативный вариант: использование at

Если у вас есть конкретное время выполнения задачи, можно использовать команду at. Для этого добавьте в очередь с отложенным выполнением следующим образом:

echo "ваша_команда" | at now + 1 minute

Однако в этом случае вам все равно нужно будет убедиться, что никакие текущие задания не мешают.

Заключение

Метод, предложенный выше, требует внимательного кода и планирования, чтобы все работало должным образом. Если ваши задачи имеют критическую взаимозависимость, обязательно протестируйте всю систему в менее загруженное время. Это обеспечит корректное выполнение всех любимых вами заданий, минимизируя конфликты.

Оцените материал
Добавить комментарий

Капча загружается...