【问题标题】:cron not running a bash script that uses datecron 没有运行使用日期的 bash 脚本
【发布时间】:2020-03-07 01:45:59
【问题描述】:

我正在测试一个脚本,该脚本为日志文件的每日轮换执行子脚本:

59 23 * * * /home/[username]/work/Rotate.sh

这个 .sh 文件调用了许多其他的 shell 脚本,每个脚本的工作方式都与此类似:

folderName=$(date +%B)
folderPath="/data/logs/archive/"
currentDate=$(date +%d-%m-%Y)
targetFile="/data/logs/logfile.log"

sudo mkdir $folderPath
sudo mkdir $folderPath$folderName

cp $targetFile $folderPath$folderName/logfile.$currentDate.log

echo "" > $targetFile

从终端直接调用 Rotate.sh 可以按预期工作(使用命令 sudo sh work/Rotate.sh),但是当我将 crons 时间缩短到更短的时间间隔时,我根本没有得到任何结果。我的 shell 脚本的某些方面是否有可能破坏了 cron 作业?我在 crontab -e 中的行声明中遗漏了什么吗?

【问题讨论】:

  • 在哪里声明了$ArchivePath$ArchivePath$ArchiveNamecron 用户是否对调用的每个其他脚本都具有执行权限?
  • 抱歉,这是我编辑代码 sn-p 以显示人们让我调整它的错误。
  • 如果您使用 sudo 获得想要的结果,您不应该在 cron 作业中也使用 sudo 吗?
  • 我用过 sudo crontab -e 但这也没有得到我需要的结果。你的意思是把cron任务写成59 23 * * * sudo /home/[username]/work/Rotate.sh
  • 是的,我的意思是在工作本身中使用它。

标签: linux bash shell cron


【解决方案1】:

此类失败的常见原因是因为您的 CRON 环境是系统支持的最低限度的环境。它不知道通过 shell 提供给您的其他环境设置。

在这种情况下,一个简单的解决方法是从您的 Shell 脚本获取 .profile。在文件开头放置以下命令必须帮助您解决此问题。

source $HOME/.profile

另一种方法是在 CRONJOB 本身中获取相同的源。

59 23 * * * . $HOME/.profile; /home/[username]/work/Rotate.sh

【讨论】:

  • 谢谢!我已经把它整理好了,感觉就像一个巨大的解脱。
猜你喜欢
  • 2012-10-22
  • 2013-11-26
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多