【问题标题】:Commands won't write to file when script is executed by croncron 执行脚本时,命令不会写入文件
【发布时间】:2024-09-09 14:20:01
【问题描述】:

我使用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

附加说明,此脚本将最新版本的管理脚本推送到远程服务器,然后通过 ssh 执行并捕获输出。当手动运行时,这项工作 100% 的时间。任何帮助都会有所帮助,谢谢!

【问题讨论】:

  • 我将 crontab 更新为以下内容:SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin * * * * 1,2,3,4,5 /bin/bash /Users/cjones/Documents/Development/Scripts/DailyStatus.sh

标签: bash shell ssh cron crontab


【解决方案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 &lt; file 的用法,而不是不必要的for host in $(cat ...)

【讨论】:

  • 我想通了,我需要在 ssh 命令中添加另一个 -t 来强制使用伪终端。 serverfault.com/questions/224307/…
  • 哦,那与我指出的问题不同 :) 很高兴看到您的脚本正在运行
最近更新 更多