Хорошо, я вижу здесь несколько проблем.Во-первых, вам нужно поместить это в файл crontab для пользователя, от имени которого вы хотите запускать скрипт.Если вы хотите запустить его под своей учетной записью, не используйте просто crontab -e
вместо sudo crontab -e
(с sudo
он редактирует файл 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 хорошо определяет типичные проблемы, такие как плохое цитирование;Я рекомендую запустить ваши скрипты через него, чтобы посмотреть, что он найдет.