Правильное форматирование исполняемого файла crontab в bash-скрипте - PullRequest
0 голосов
/ 07 июня 2018

У меня возникли серьезные проблемы с попыткой найти правильный формат для моего bash-скрипта, чтобы он мог успешно работать в crontab.Скрипт bash успешно запускается при запросе вручную из командной строкиВот рассматриваемый скрипт bash (сами параметры [$ 1 и $ 2] были помещены в скрипт вручную):

#!/bin/bash
# Usage: ./s3DeleteByDateVirginia "bucketname" "file type"

past=$(date +"%F" -d "60 days ago")

aws s3api list-objects --bucket $1 --query 'Contents[?LastModified<=`'$past'`][].{Key:Key}' | grep $2 | while read -r line
do
fileName=`echo $line`
aws s3api delete-object  --bucket $1 --key "$fileName"
done;

Сценарий находится в этом файле bash: / home / ubuntu / s3DeleteByDateVirginiaSoco1 Toустановите скрипт, который я использую: sudo crontab –e Теперь я вижу, что люди в сети говорят, что вам нужно указать правильный путь, который не имеет никакого смысла для меня, особенно когда речь идет о том, чтобы поместить его в нужное место, потому что я вижуряд различных модификаций этого онлайн, но он состоит из этого формата: SHELL = / bin / sh sPATH = / bin: / sbin: / usr / bin: / usr / sbin, но я не знаю, где его разместить.

Согласно системному журналу, функции cron, которые работают, но сам скрипт не выполняется: syslog

В дополнение к этому скрипт имеет все необходимыеразрешения на запуск.В общем, я больше запутался, когда начал, и не вижу много документации о том, как работает crontab.

Crontab в вопросе: enter image description here

Дополнительные правки, основанные на предложениях пользователя: Вот мой отлаженный скрипт: enter image description here

Вот строка crontab:

 # m h  dom mon dow   command

PATH=/usr/local/bin:/usr/bin:/bin:/root/.local/bin/aws
33 20 * * *  /home/ubuntu/s3DeleteByDateSoco1

Обновленный системный журнал: enter image description here

1 Ответ

0 голосов
/ 07 июня 2018

Хорошо, я вижу здесь несколько проблем.Во-первых, вам нужно поместить это в файл crontab для пользователя, от имени которого вы хотите запускать скрипт.Если вы хотите запустить его под своей учетной записью, не используйте просто crontab -e вместо sudo crontab -esudo он редактирует файл crontab корневого пользователя).

Во-вторых, вам нужно использоватьправильный путь и имя для скрипта;похоже, это /home/ubuntu/s3DeleteByDateVirginiaSoco1, так что это должно быть в записи crontab.Не добавляйте «.sh», если он не является частью имени файла.Выглядит так, как будто вы пытались добавить «root» перед путем;также не делайте этого, так как crontab попытается выполнить «root» как команду, и это не удастся.bash -c не повредит, но и вовсе не помогает, поэтому не используйте его.

В-третьих, необходимо правильно задать PATH для исполняемых файлов, используемых в сценарии.По умолчанию задания cron выполняются со значением PATH, равным «/ usr / bin: / bin», поэтому, когда вы используете команду, подобную aws, она будет выглядеть как /usr/bin/aws, а не найдена, ищите еекак /usr/aws, не найдите его и выдайте ошибку «aws: команда не найдена», которую вы видите в последней записи журнала.Во-первых, вам нужно выяснить, где находится aws (и любые другие программы, от которых зависит ваш скрипт);Вы можете использовать which aws в своей обычной оболочке, чтобы выяснить это.Предположим, это / usr / local / bin / aws.Затем вы можете либо:

  • добавить строку типа PATH=/usr/local/bin:/usr/bin:/bin (возможно, с любыми другими каталогами, которые вы считаете подходящими) в файл crontab, до строку, котораяговорит запустить ваш скрипт.

  • Добавьте строку типа PATH=/usr/local/bin:/usr/bin:/bin (возможно, с любыми другими каталогами, которые вы считаете подходящими) в ваш файл скрипта, до строки, которые используют aws.

  • В вашем скрипте используйте явный путь каждый раз, когда вы хотите запустить aws (что-то вроде /usr/local/bin/aws s3api list-objects ...)

Вы можете использовать любое (или все) из вышеперечисленного, но вы должны использовать хотя бы одну, иначе не сможете найти команду aws (или что-либо еще, что не входит в наборосновные команды, которые поставляются с ОС).

В-четвертых, я не вижу, где поставляются $1 и $2.Вы говорите, что они были помещены в сценарий вручную, но я не знаю, что вы подразумеваете под этим.Поскольку скрипт ожидает их в качестве параметров, вам необходимо указать их в файле crontab (т. Е. Команда в crontab должна выглядеть примерно так: /home/ubuntu/s3DeleteByDateVirginiaSoco1 bucketname pattern).

В-пятых, сам скрипт не следует правилам цитирования,В общем, все переменные ссылки должны быть в двойных кавычках.Например, используйте grep "$2" вместо grep $2.Без двойных кавычек переменные, содержащие пробелы или определенные метасимволы оболочки, могут вызвать странные проблемы с синтаксическим анализом.

Наконец, почему вы делаете fileName=echo $line (с обратными кавычками я не могу здесь повторить)?В основном это просто копирует значение $line в переменную fileName, но может иметь те странные проблемы с синтаксическим анализом, о которых я упоминал в последнем пункте.Если вы хотите надежно скопировать переменную, просто используйте fileName="$line" (или fileName=$line - это один из немногих случаев, когда можно не использовать двойные кавычки).

Кстати, shellcheck.net хорошо определяет типичные проблемы, такие как плохое цитирование;Я рекомендую запустить ваши скрипты через него, чтобы посмотреть, что он найдет.

...