Как запустить команду 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
здесь) цитируется.