Вопрос или проблема
Я регулярно планирую десятки или больше задач с помощью 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
Однако в этом случае вам все равно нужно будет убедиться, что никакие текущие задания не мешают.
Заключение
Метод, предложенный выше, требует внимательного кода и планирования, чтобы все работало должным образом. Если ваши задачи имеют критическую взаимозависимость, обязательно протестируйте всю систему в менее загруженное время. Это обеспечит корректное выполнение всех любимых вами заданий, минимизируя конфликты.