当 cron 运行时,将输出从 telnet / nc 重定向到脚本中的文件会失败

当 cron 运行时,将输出从 telnet / nc 重定向到脚本中的文件会失败

因此,我的网络上有一个设备,它正在监听端口上的连接,当建立连接时,它会转储 ascii 数据。我需要将这些数据捕获到一个文件中。我编写了一个非常简单的 shell 脚本来执行此操作:

#!/bin/bash

#Config Variables. Age is in Days.
DATA_ROOT=/root/data
FILENAME=data_`date +%F`.dat
HOST=device
COMPRESS_AGE=3

#Sanity Checks
if [ ! -e $DATA_ROOT ]
then
        echo "The directory $DATA_ROOT seems to not exist. Please create it."
        exit 1
fi

if [ -e $DATA_ROOT/$FILENAME ]
then
        echo "You seem to have extracted data already today. Aborting"
        exit 1
fi


#Get Data
nc $HOST 2202 > $DATA_ROOT/$FILENAME
#Compress old Data
find $DATA_ROOT -type f -mtime +$COMPRESS_AGE -exec gzip {} \;

exit 0

当我手动运行它时,它工作得很好,但是当我从 cron 运行它时,它不会捕获任何输出。如果我用 telnet 替换 nc,我会看到有关转义序列等的初始 telnet 标头,但看不到数据。

有什么想法吗?我尝试使用 -i 强制 bash 充当交互式 shell。我尝试重定向 stderr 和 stdout。我知道这肯定是一些愚蠢的简单事情,但我完全失败了。这让我发疯了……

编辑我还注意到,我之前尝试的所有 nc 进程都处于休眠状态,当我终止它们时,cron 向我发送了一堆无意义的错误消息。至少现在我有一些东西可以深入研究了!

答案1

您的脚本可能正在运行,只是输出丢失了。您可以尝试将 nc 输出捕获到它自己的变量中,然后将该变量回显到

#Get Data
ncoutput=$( /path/to/nc $HOST 2202 2>&1 )
printf "%s\n" "$ncoutput" > $DATA_ROOT/$FILENAME
#Compress old Data
find $DATA_ROOT -type f -mtime +$COMPRESS_AGE -exec gzip {} \;

exit 0

printf保留输出的格式,而回声没有。

相关内容