Cron 无法运行 bash 脚本

Cron 无法运行 bash 脚本

我有 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 个掩码,因此每个用户都应该能够使用它。有什么想法吗?

答案1

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

首先我想说nc不要使用telnet- telnet 尝试各种交互式线路协商(TELOPTS)和其他事情,而nc只是创建一个原始的、干净的连接。

其次,time_conv.awk 在哪里?也许您应该指定该文件的完整路径?

答案2

在 cron 中,您不再有 tty 会话,它是非交互式的。我认为 telnet 不喜欢这样。您将需要其他一些程序来获取连接。一个用于执行 tcp 连接并转储其内容的简单程序应该是一个非常小的程序,即使对于嵌入式工作也是如此。

如果你正在运行嵌入式系统,并且如果您有 bash,也许您的 bash 版本支持/dev/tcp/host/port伪设备。这需要在重定向中使用,而不是打开文件。IEcat < /dev/tcp/host/port可以工作,但cat /dev/tcp/host/port会出现错误。

DAYTIME=$(cat < /dev/tcp/$ADDR/$DTPORT | time_conv.awk)

相关内容