2011-04-21 118 views
2

我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 
} 
+0

你如何運行它?是'bash

0

你應該提到你得到的具體錯誤信息。無論如何,既然你說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(我的建議)
1

好。狂猜的時間...

你使用的是.rhosts文件嗎?這樣,當你telnet時,你不必輸入密碼。你不能在crontab腳本中做到這一點。

如果是這樣的原因,你必須做三兩件事:

  • 找出的crontab下運行哪些用戶。
  • 對於該用戶,運行ssh-keygen程序,並生成公鑰和私鑰。爲遠程機器做同樣的事情。現在,在遠程機器上創建authorized_hosts文件並添加公鑰。
  • 完成此操作後,從telnet切換到ssh。反正SSH更安全。