我有这个的变体问题还有一些额外的细节。我的脚本由 cron 作业运行,但它没有执行 SFTP,也没有像我希望的那样记录。当我检查它应该将文件发送到哪里时,它们不在那里。这些文件只有在我手动运行时才会出现在那里,而在 Cron 作业中运行时则不会出现。
我有两次记录尝试:
首先在 cron 作业本身中(我已经尝试过我的用户和“root”):
15 17 * * * nw /bin/sh /home/nw/scripts/SftpScriptLoop.sh >> /home/nw/scripts/SftpScriptLoop_cron.log
其次在脚本中记录log.txt。
当我自己运行脚本时,log.txt 会被填充,但是当我使用 Cron 作业运行时它永远不会被填充。
我知道 cron 任务正在运行,因为 SftpScriptLoop_cron.log 已创建,但它是空的。我删除了它,然后再次测试以验证。
我在脚本中使用完全限定的磁盘路径。
我的 Bash 脚本(它使用“此处文档”将数据传递到 SFTP 命令的标准输入):
#!/bin/bash
for filename in /home/nealwalters/downloads/*.csv; do
currentDate=`date`
echo "Loop: Filename=$filename"
echo "$currentDate SFTPUser3 Filename=$filename" >> /home/nealwalters/scripts/log.txt
sftp -i /home/nealwalters/keys/SFTPUser1_Private.pem [email protected] << EOF
cd User3ToMyCompany
put $filename
exit
EOF
echo "--------------------------------------------"
done
Ubuntu 20.04
“grep CRON /var/log/syslog” 的结果。
第 2 部分 - 如有疑问,请简化。一天后更新。
我喜欢这个答案问题,但我甚至无法让下面的工作。
我创建了三个包含一些虚拟文本的文件:TouchFileScript1.txt、TouchFileScript2.txt 和 TouchFileCron.txt
我创建了一个 bin 目录(不确定是否需要,因为我最初的目录名是“scripts”。)
我创建了一个名为 TouchFileCron1.sh 的 bash 脚本,其中只有以下一行:
touch /home/nealwalters/bin/TouchFileScript1.txt
我创建了一个名为 TouchFileCron2.sh 的 bash 脚本,其中只有以下一行(试图确定 crontab 中是否需要 /sh/bin):
touch /home/nealwalters/bin/TouchFileScript2.txt
/etc/crontab 现在有以下两行:
* * * * * root touch /home/nealwalters/bin/cronlog.txt
* * * * * root /home/nealwalters/bin/TouchFileScript1.sh
* * * * * root /bin/sh /home/nealwalters/bin/TouchFileScript2.sh
基本上第一个可以行,后两个不行。
结果 - /var/log/syslog 的尾部 - 并列出我的所有文件。您可以看到哪些文件被标记为可执行文件。TestFileCron.txt 的日期/时间每分钟更改一次。其他两个不受影响。
既然我在 crontab 中运行的是“root”,那么所有权是否重要?我截屏时,cron 最后一次运行的时间是 17:28。其他文件仍处于我创建它们的 17:22。
答案1
由于我将输出重定向到文件,我认为我的情况有所不同,但它基本上通过这篇文章得到了解决: 系统日志中出现“(CRON) 信息(未安装 MTA,丢弃输出)”错误
我没有对“stderr”进行任何重定向。
我有 Windows 背景,因此对于我来说,邮件用于记录错误而不是将其写入文件真是令人难以置信。
Linux 使用邮件向用户发送通知。大多数 Linux 发行版都安装了邮件服务,其中包括 MTA(邮件传输代理)。但 Ubuntu 没有。
您可以安装邮件服务(例如 postfix)来解决此问题。
sudo apt-get install postfix
然后查看错误:
sudo tail -f /var/mail/nealwalters
(其中 nealwalters 可以替换为您的用户)。