Я знаю, что мой вопрос задавали несколько раз, но решения моей проблемы нет. В моей компании есть приложение, работающее на 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 этот или этот, что должно устранить любые проблемы, связанные с назначением переменных.