的Cron无法运行bash脚本
我bash脚本的Cron无法运行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
}
我猜一些路径缺少...你尝试使用/ usr/bin中/远程登录而不是远程登录?
要查找telnet的路径,您可以使用which telnet
。
是的,我把/ usr/bin/telnet而不是telnet,它的行为是一样的。 – Damir 2011-04-21 09:47:13
'time_conv.awk'怎么样? – tamasgal 2011-04-21 09:48:18
这是一个简单的awk脚本,用于将日间服务器给出的时间格式转换为yyyy-mm-dd hh:mm:ss。在调试脚本版本时,我将bash脚本中的每个调用分开,唯一失败的是telnet,它甚至不会输出错误(在这种情况下,我使用telnet $ ADDR $ DTPORT 2>&1 | tee /tmp/garbage.tmp,并且从cron调用时给出的文件为空,但在从命令行调用时包含正常数据)。 – Damir 2011-04-21 09:53:44
你应该提到你得到的具体错误信息。无论如何,既然你说telnet行导致错误,我假设以下常见的陷阱:
- 您的脚本需要Bash shell才能正常运行。
- 系统的默认shell不是
/bin/bash
。看看/bin/sh
指向什么,例如与ls -l /bin/sh
- 您的帐户,不过,被设置为具有
/bin/bash
作为默认的shell(也许这是在/etc/passwd
为您的帐户或由可变$SHELL
手段
解决方案:
- 更改系统的默认外壳(取决于您的系统,而不是我推荐的)
- 使您的cronjob使用Bash作为默认设置:在crontab中设置
SHELL=/bin/bash
- 更改脚本一号线提猛砸明确:
#!/bin/bash
(我的建议)
好。狂猜的时间...
你使用的是.rhosts
文件吗?这样,当你telnet时,你不必输入密码。你不能在crontab脚本中做到这一点。
如果是这样的原因,你必须做三两件事:
- 找出的crontab下运行哪些用户。
- 对于该用户,运行
ssh-keygen
程序,并生成公钥和私钥。为远程机器做同样的事情。现在,在远程机器上创建authorized_hosts文件并添加公钥。 - 完成此操作后,从telnet切换到ssh。反正SSH更安全。
你如何运行它?是'bash
time_conv.awk的内容是什么? – bmk 2011-04-21 09:52:32
@Draco Alter我用/ bin/bash而不是/ bin/sh试过了,结果相同。 – Damir 2011-04-21 09:55:21