Назад | Перейти на главную страницу

Linux (Redhat); Crontab; bash - скрипт работает из оболочки, но не в Crontab - не удается назначить команду переменной

Я знаю, что мой вопрос задавали несколько раз, но решения моей проблемы нет. В моей компании есть приложение, работающее на RedHat Mashine. Пользователи подключают к этому серверу текстовый графический интерфейс через ssh. Это приложение не поддерживает пароль для сброса устаревшего пароля.

Я сделал скрипт, проверяющий время устаревания пароля и отправляющий электронное письмо каждому пользователю.

Скрипт отлично работает из оболочки, но не работает в crontab. Несколько тестов (touch testfile) показали, что crontab работает и все скрипты выполняются. Я проверил это с помощью простой команды echo в начале нового скрипта.

более глубокое исследование с помощью нескольких эхо-сигналов показало мне, что существует проблема с назначением команды переменной.

Это работало годами и в нескольких crontab

 VAR = `ls`

я тестировал другие версии:

VAR = $(ls)
VAR = `/bin/ls`
VAR = $(/bin/ls)

Фрагмент из скрипта:

(... generating user/email array ...)
echo "----------------START "$LOGDATE" ---------------" >> $LOGFILE

for ((i=0; i<${#USER[*]} ; i++))

do

USERNAME=${USER[$i]}

EMPFAENGERNAME=${EMPFAENGER[$i]}

TEMP1=`chage -l $USERNAME | grep 'Kennwort läuft ab'|cut -d ":" -f2`

(... sending email to user telling him to change password ...)

Crontab: (корень)

00 12 * * 1-5 /root/pw_warning.sh

Этот сценарий настолько прост и работает как root и с sudo, в нем нет ничего сложного, но я не понимаю, что я делаю неправильно.

Обновить:

Протестировано PATH = (..) в crontab и в скрипте, как было предложено. Никаких изменений.

Опять же: crontab работает и выполняет скрипты. Каждая команда в сценарии работает сама с собой, но не тогда, когда ее следует назначить переменной.

Обновление2: Добавление пути к оболочке не помогло:

   0 0 * * * /bin/bash /path/to/script.sh

Обновление 3:

Рабочее решение:

0 0 * * * ssh root@localhost "/path/to/script"

Cron передает вашим заданиям минимальный набор переменных среды.

Распространенной ошибкой здесь является то, что переменная среды PATH отличается.

Чтобы обойти это, просто установите свою собственную переменную PATH в верхней части скрипта. Например.

#!/bin/bash
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# rest of script follows

Вы также можете установить переменную PATH в файле crontab, которая будет применяться ко всем заданиям cron. Например.

PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

15 1 * * * backupscript --incremental /home /root

отсюда

Кроме того, судя по назначению переменных, которое вы используете, ваш скрипт не будет работать в /bin/sh, убедитесь, что ваша первая строка верна:

#!/bin/bash

Или лучше запустите свой скрипт как

0 0 * * * /bin/bash /path/to/script.sh

вместо просто /path/to/script.sh

Наконец, вы можете попытаться поместить следующий хакерский код в свой crontab, поскольку он должен работать точно так же, как если бы вы сами запускали скрипт из оболочки:

 15 1 * * * ssh root@localhost "/path/to/script.sh"

Однако проблема в вашем сценарии. Попробуйте использовать какой-нибудь шаблон сценария bash этот или этот, что должно устранить любые проблемы, связанные с назначением переменных.