Cron не запускает скрипт bash - PullRequest
2 голосов
/ 21 апреля 2011

У меня есть скрипт bash

#!/bin/sh

DTFILE=/etc/daytime.addr
DTPORT=13
DAYTIME_ERROR=/tmp/dtm.err

function daytime_error(){
    if [[ -z $1 ]]
    then 
    exit 1
    fi
    if [[ -e $DAYTIME_ERROR ]]
    then
    echo "Error already reported"
    else
    logger "$1"
    touch $DAYTIME_ERROR
    fi
    exit 1
}

if [[ -s $DTFILE ]]
then
    ADDR=$(head -n1 $DTFILE)
    DAYTIME=$(telnet $ADDR $DTPORT | time_conv.awk)
    if [[ -z $DAYTIME ]]
    then
    daytime_error "Daytime client: no connection to $ADDR"
    else
    date -s "$DAYTIME"
    hwclock -w
    rm $DAYTIME_ERROR
    fi

else
    daytime_error "Daytime client: no daytime server address in file $DTFILE"
fi

и он работает при вызове из командной строки, но не работает, когда cron вызывает его. В частности, строка с командой telnet дает нулевые байты вывода. Telnet имеет маску 755, поэтому каждый пользователь должен иметь возможность использовать ее. Есть идеи?

Обновление, содержимое time_conv.awk:

#! /usr/bin/awk -f

/[0-9]+:[0-9]+:[0-9]+/ {
    if ($2~/Jan/) $2=1;
    else if ($2~/Feb/) $2=2;
    else if ($2~/Mar/) $2=3;
    else if ($2~/Apr/) $2=4;
    else if ($2~/May/) $2=5;
    else if ($2~/Jun/) $2=6;
    else if ($2~/Jul/) $2=7;
    else if ($2~/Aug/) $2=8;
    else if ($2~/Sep/) $2=9;
    else if ($2~/Oct/) $2=10;
    else if ($2~/Nov/) $2=11;
    else if ($2~/Dec/) $2=12;
    print $5 "-" $2 "-" $3 " " $4
}

Ответы [ 3 ]

1 голос
/ 06 июня 2011

Хорошо. Дикий угадай время ...

Используете ли вы файл .rhosts? Таким образом, когда вы используете telnet, вам не нужно вводить пароль. Вы не можете сделать это в скрипте crontab.

Если это причина, вам нужно сделать три вещи:

  • Узнайте, под каким пользователем работает crontab.
  • Для этого пользователя запустите программу ssh-keygen и сгенерируйте открытый и закрытый ключ. Сделайте то же самое для удаленной машины. Теперь создайте файл author_hosts на удаленном компьютере и добавьте свой открытый ключ.
  • Как только это будет сделано, переключитесь с telnet на ssh. В любом случае, SSH более безопасен.
1 голос
/ 21 апреля 2011

Я предполагаю, что некоторые пути отсутствуют ... Вы пытались использовать / usr / bin / telnet вместо telnet?

Чтобы найти путь к telnet, вы можете использовать which telnet.

0 голосов
/ 05 июня 2011

Вы должны упомянуть конкретные сообщения об ошибках, которые вы получаете.В любом случае, поскольку вы говорите, что линия telnet вызывает ошибку, я предполагаю следующую распространенную ошибку:

  • Для вашего скрипта требуется, чтобы оболочка Bash работала правильно.
  • Оболочка по умолчанию вашей системыне /bin/bash.Посмотрите на то, на что указывает /bin/sh, например, с ls -l /bin/sh
  • . Однако ваша учетная запись настроена на /bin/bash в качестве оболочки по умолчанию (вероятно, для вашей учетной записи она установлена ​​в /etc/passwd илисредства переменной $SHELL.

Решения:

  • Изменить оболочку по умолчанию вашей системы (зависит от вашей системы, а не от того, что я рекомендую).
  • Сделайте так, чтобы ваши cronjobs использовали Bash по умолчанию: установите SHELL=/bin/bash в crontab.
  • Измените первую строку вашего скрипта, чтобы явно упомянуть Bash: #!/bin/bash (моя рекомендация)
...