cron не выполняет задание bash

так что я видел что-то действительно странное и, возможно, простое? но не настолько просто, чтобы я не мог понять. Я написал простой сценарий 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"

Может ли это какая-то проблема с синтаксисом в сценарии? и если да, то почему он должен работать без проблем при запуске вручную?

0
07.02.2017, 18:08
3 ответа

Довольно поздно, но я нашел решение: запустить скрипт с опцией -l. cronjob не будет запущен из-за переменных, которые я установил в оболочке входа, также он не будет регистрировать никаких ошибок. Согласно man-странице:

-l Заставьте bash вести себя так, как будто он был вызван как оболочка для входа в систему (см. ИНВОКАЦИЯ ниже).

поэтому мой crontab будет выглядеть так:

30 * * * * /usr/scripts/test_script.sh
0
28.01.2020, 04:48

Когда cron запускает его, он get выполняется с оболочкой 'sh', которая не поддерживает синтаксис &> . Он мог работать правильно с синтаксисом SHELL, который вы установили для /etc/cron.d/tes_script, но файлы в /etc/cron.d нуждаются в другом синтаксисе (добавление имени пользователя в качестве поля), который вы не использовали .

Чтобы исправить это, установите SHELL = / bin / bash в вашем собственном crontab.

0
28.01.2020, 04:48

Вот некоторые догадки, основанные на вашем коде:

  1. В каком каталоге находятся ваши "$HOLDER "*.bz2 файлы? Я не вижу никакой команды cd в вашем скрипте. Возможно, скрипт выполняется в неправильном каталоге.
  2. Переменная $HOLDER не определена.
  3. Есть ли sync-pocks в вашем пути?
0
28.01.2020, 04:48

Теги

Похожие вопросы