так что я видел что-то действительно странное и, возможно, простое? но не настолько просто, чтобы я не мог понять. Я написал простой сценарий bash, который я могу нормально запускать без проблем, проблема возникает, когда я планирую задание cron, которое затем не запускает мой сценарий.
Скрипт исполняемый, скрипт может быть выполнен вручную без ошибок / проблем. Я попытался добавить его в crontab следующим образом:
# crontab -l
30 * * * * /usr/scripts/test_script.sh
Я также попытался добавить файл в /etc/cron.d/test_script
и попытался указать путь и оболочку:
# cat /etc/cron.d/tes_script
PATH=/bin:/usr/bin:/sbin:/usr/sbin
SHELL=/bin/bash
30 * * * * /usr/scripts/test_script.sh
I пытались проверить журналы с помощью tailf / var / log / syslog
, и я вижу следующее:
7 февраля 10:53:01 CRON [29203]: (root) CMD (/ usr / scripts / test_script.sh)
, поэтому кажется, что он может быть запущен, но на самом деле это не так (запускается процесс обновления, который можно увидеть в веб-интерфейсе программы).
Я могу что-нибудь упустить? Вот сценарий
#!/bin/bash
DIST="ubuntu"
LOGS="/var/logs/test_script.log"
RECIPIENTS="myemail@domain.com"
declare -a POCKET=("release" "security" "updates")
xenial()
{
SERIES="xenial"
for pocket in "${POCKET[@]}"
do
bzip2 -d "$HOLDER"*.bz2
sync-pocks "$pocket" "$SERIES" "$DIST"
sleep 5m
done
return 0
}
precise()
{
SERIES="precise"
for pocket in "${POCKET[@]}"
do
bzip2 -d "$HOLDER"*.bz2
sync-pocks "$pocket" "$SERIES" "$DIST"
sleep 5m
done
return 0
}
xenial &> "$LOGS" &&
precise &>> "$LOGS" ||
cat "$LOGS" | mailx -s "Sync" "$RECIPIENTS"
Может ли это какая-то проблема с синтаксисом в сценарии? и если да, то почему он должен работать без проблем при запуске вручную?
Довольно поздно, но я нашел решение: запустить скрипт с опцией -l. cronjob не будет запущен из-за переменных, которые я установил в оболочке входа, также он не будет регистрировать никаких ошибок. Согласно man-странице:
-l Заставьте bash вести себя так, как будто он был вызван как оболочка для входа в систему (см. ИНВОКАЦИЯ ниже).
поэтому мой crontab будет выглядеть так:
30 * * * * /usr/scripts/test_script.sh
Когда cron запускает его, он get выполняется с оболочкой 'sh', которая не поддерживает синтаксис &>
. Он мог работать правильно с синтаксисом SHELL, который вы установили для /etc/cron.d/tes_script, но файлы в /etc/cron.d нуждаются в другом синтаксисе (добавление имени пользователя в качестве поля), который вы не использовали .
Чтобы исправить это, установите SHELL = / bin / bash
в вашем собственном crontab.
Вот некоторые догадки, основанные на вашем коде:
"$HOLDER "*.bz2
файлы? Я не вижу никакой команды cd
в вашем скрипте. Возможно, скрипт выполняется в неправильном каталоге. Переменная $HOLDER
не определена. sync-pocks
в вашем пути?