当cron执行脚本时,命令不会写入文件

时间:2014-12-31 15:15:48

标签: bash shell ssh cron crontab

我使用crontab -e来安排shell脚本的执行,该脚本执行ssh调用服务器列表并获取信息并打印到文件。 crontab -l的输出是:

SHELL = /bin/sh
PATH = /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
*   1   *   *   1,2,3,4,5   /bin/bash /Users/cjones/Documents/Development/Scripts/DailyStatus.sh

我正在运行的脚本将echo "Beginning remote connections..." >> $logfile的输出记录到文件但是不会将以下循环的输出记录到文件中:

for servers in $(cat hostnames.txt); do
    echo "Starting connection to $servers" >> $logfile
    (rsync -av /Users/cjones/Documents/Development/Scripts/checkup.sh cjones@$servers:~/checkup.sh > /dev/null
    echo""
    ssh -t $servers "sudo ./checkup.sh") >> $logfile
    echo ""
done

完整脚本的Pastebin:http://pastebin.com/3vD7Bba0

另外请注意,此脚本会将最新版本的管理脚本推送到远程服务器以执行和捕获输出。这种工作在手动运行时有100%的时间。任何帮助都会有所帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

您需要SHELL=/bin/shPATH相同。 =周围的空格是错误的。

此外,当您使用crontab调用脚本中的文件时,请使用完整路径:

for servers in $(cat hostnames.txt); do
    echo "Starting connection to $servers" >> $logfile
    (rsync -av /Users/cjones/Documents/Development/Scripts/checkup.sh cjones@$servers:~/checkup.sh > /dev/null
    echo""
    ssh -t $servers "sudo ./checkup.sh") >> $logfile
    echo ""
done

while read $servers
do
    echo "Starting connection to $servers" >> $logfile
    (rsync -av /Users/cjones/Documents/Development/Scripts/checkup.sh cjones@$servers:~/checkup.sh > /dev/null
    echo""
    ssh -t $servers "sudo ./checkup.sh") >> $logfile
    echo ""
done < /path/to/hostnames.txt
       ^^^^^^^^^

请注意while read; do ... done < file的使用情况,而不是不必要的for host in $(cat ...)