Как запустить команду bash с аргументами в назначенное время

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

Я хочу выполнить определенную команду bash через 24 часа после запуска процесса для определенного файла.

Я пытался использовать at для этого, однако, я не думаю, что вы можете использовать at для запуска команды bash:

at now +24 hours gsutil rm gs://$google_cloud_storage_location/$processed_file

И я также не могу заставить его запустить скрипт bash с аргументами.

at now +24 hours -f example_script.bash $google_cloud_storage_location/$processed_file

Как правильно планировать эти задачи? Нужен ли мне просто другой инструмент или мне не хватает способа at?

Пример скрипта bash:

for file in list_of_files; do
    #do some processing
    ....
    #then delete the file
    at now +24 hours gsutil rm gs://file
done

2 ответа

Решение

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

echo "gsutil rm gs://$google_cloud_storage_location/$processed_file" | at now +24 hours

Для второго примера синтаксис может быть

echo "/path/to/example_script.bash $google_cloud_storage_location/$processed_file" | at now +24 hours

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

echo -e '#!/bin/bash' > /path/to/script

затем

echo '<your command here>' >> /path/to/script

Тогда синтаксис для at команда

at now +24 hours -f /path/to/script

Конечно, +24 hours часть должна быть отрегулирована на надлежащую продолжительность.

Поскольку at читает команды из стандартного ввода или из файла:

for file in list_of_files; do
    #do some processing
    ....
    #then delete the file
    at now +24 hours <<EOF
gsutil rm gs://"$file"
EOF
done

Использование heredoc для предоставления команд будет работать, поскольку переменные раскрываются в heredoc, если только маркер heredoc (EOFздесь) цитируется.

Другие вопросы по тегам