Cron не вдається запустити bash-скрипт


1

У мене є скрипт 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, тому кожен користувач повинен мати можливість його використовувати. Будь-які ідеї?


Ви говорите, що це вбудована система ... можете спробувати додати /path/to/bash /path/to/script на крон, а не на /path/to/script для мене гумор? Також додайте повний шлях до будь-яких не вбудованих виконуваних файлів, таких як telnet?
PriceChild

Якщо ви запустите скрипт #!/bin/sh це насправді не сценарій bash, навіть якщо / bin / sh символічно пов'язаний з bash. Bash веде себе по-іншому, якщо викликається як "sh".
glenn jackman

Відповіді:


2
DAYTIME=$(telnet $ADDR $DTPORT | time_conv.awk)

Спочатку я б сказав, що використовую nc ні telnet - Telnet намагається всілякі переговори між інтерактивними лініями (TELOPTS) і речі, тоді як nc просто створює сире, чисте, з'єднання.

По-друге, де time_conv.awk? Можливо, вам слід вказати повний шлях до цього файлу?


nc недоступний, оскільки він використовується на вбудованій системі. time_conv.awk в / usr / bin. Я намагався поставити абсолютні шляхи на кожний виклик у цьому сценарії, але безрезультатно.
Damir

2

У cron у вас більше немає сеансу tty, він не є інтерактивним. Я думаю, що telnet це не подобається. Вам знадобиться інша програма для отримання з'єднання. Проста програма для з'єднання tcp і dump його вмісту повинна бути дуже маленькою програмою, навіть для вбудованої роботи.

Якщо ви працюєте вбудовано, та якщо у вас є bash, можливо, ваша версія bash підтримує /dev/tcp/host/port псевдопристрій. Це потрібно використовувати для перенаправлення, а не для відкритого файлу. I.E. cat < /dev/tcp/host/port буду працювати, cat /dev/tcp/host/port дасть помилку.

DAYTIME = $ (cat & lt; / dev / tcp / $ ADDR / $ DTPORT | time_conv.awk)


Це правда, що telnet скаржиться на відсутність інтерактивної оболонки, але я не маю / dev / tcp. Чи є інший спосіб?
Damir

@Damir, пам'ятайте, що ви не можете робити 'ls / dev / tcp', це щось у bash. Ви можете зробити "cat & lt; / dev / tcp / somehost / chargen '. Якщо ні, то вам потрібно щось на зразок netcat або компілювати свої власні.
Rich Homolka
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.