Я знаю, что мой вопрос задавали несколько раз, но для моей проблемы нет решения. В моей компании есть приложение, работающее на RedHat Mashine. Пользователи подключают к этому серверу текстовый графический интерфейс через ssh. Это приложение не поддерживает сброс пароля устаревания пароля.
Я создал сценарий, проверяющий время устаревания пароля и отправляющий электронное письмо каждому пользователю.
Скрипт работает нормально из оболочки, но не работает в crontab. Несколько тестов (touch testfile) показали, что crontab работает и все скрипты выполняются. Я проверил это с помощью простой команды echo в начале нового скрипта.
более глубокое исследование с помощью нескольких 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: (root)
00 12 * * 1-5 /root/pw_warning.sh
Этот скрипт настолько прост, он работает как root и с sudo, в нем нет ничего сложного, но я не понимаю что я делаю неправильно.
Обновление:
Протестировано PATH = (..) в crontab и в скрипте, как было предложено. Никаких изменений вообще.
Опять же: crontab работает и выполняет сценарии. Каждая команда в сценарии работает сама с собой, но не тогда, когда ее следует назначить переменной.
Обновление2: Добавление пути к оболочке не сработало:
0 0 * * * /bin/bash /path/to/script.sh
Update3:
Рабочее решение:
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 this или this , который должен устранить любые проблемы, связанные с назначением переменных.