【问题标题】:Run cron from specific directory and log time in log file从特定目录运行 cron 并在日志文件中记录时间
【发布时间】:2015-08-31 09:28:25
【问题描述】:

我有这个从外部地址解析图像的脚本。 我需要确保脚本在特定目录中运行。我也想记录时间。

这是我为 cronjob 所做的:

*/2 * * * * cd /path/to/script; (time /path/to/script/code.sh arg) &>> /path/to/log/time.log)

我的 shell 脚本非常简单:

#!/bin/sh
timestamp()
{
    date +"%Y-%m-%d %T"
}
echo "###########################"
echo $(timestamp)
python /path/to/script/parser1.py "-s$1"
python /path/to/script/parser2.py "-s$1"

我收到邮件给我的用户,但它只是 $(timestamp) 回显。我的 time.log 文件中应该有时间戳,并且 parser1 和 parser2 的输出也应该更新。我不知道为什么这不起作用!我可以从命令行运行 cronjob 命令,它可以工作。

【问题讨论】:

  • 您的*.py 文件没有任何调试输出吗?你能在parser*文件的开头插入一些打印吗?
  • 如果你在你的shell脚本中在echo $(timestamp)之后插入一个echo $(type python),你会得到什么?
  • 我的 python 文件确实有调试输出。好吧,我有从命令行运行时出现的调试输出。只是当我从 cronjob 运行它时它没有被放入日志文件中。并且该回显返回“python is /usr/bin/python”
  • 好的,现在如果您在 shell 脚本中的 echo $(timestamp) 之后插入一个 echo $(pwd),您会看到什么?
  • 如果还在苦苦挣扎,我的建议是比较code.sh 您的正常环境中看到的整个环境变量集。这可以通过在您的 shell 脚本中插入 echo $(env) 然后在终端中手动调用 env 来完成。比较应该会有所帮助。

标签: bash shell logging cron


【解决方案1】:

所以,我认为问题在于cron 正在运行您的脚本,而不是从您要运行它的目录中。我不确定,但我相信cron/root/ 目录执行脚本。

试试这个 - 在你的时间戳函数下面添加这个 - 当然是用正确的路径修改。

DIRNAME=/path/to/directory
LOGFILE=logfile.log
cd ${DIRNAME}
echo $(timestamp) >> ${LOGFILE}

然后删除当前的echo $(timestamp) 行。

另外,请确保日志文件存在,并且您对该文件具有写入权限。

【讨论】:

  • 根据 OP 的代码示例,*.py 文件以绝对路径调用。您确定cron 当前工作目录仍然重要吗?
  • 感谢您的帮助!该文件存在,我确实有写权限。当我尝试使用您的修改运行 shell 脚本时,我没有在日志中得到任何输出。这是运行 shell 时输出的一部分:./shell.sh: 10: ./shell.sh: [[: not found
  • 然后放弃测试。它只是检查以验证文件是否存在。请参阅修改后的代码。 @chatraed - 不,我不确定 - 讨论的好点。不过,我确实相信,如果 python 脚本没有在内部指定绝对路径,那么工作目录是相关的。 (即,您可能希望通过从另一个目录调用 python 脚本从工作目录运行 python 脚本)
  • @ice13berg:我同意 python 脚本可以依赖于从特定路径(通常是它们存储的路径)调用它们这一事实。
  • @ice13berg 我进行了更改,它的行为与邮件文件相同,它只在日志中打印时间戳。哪个好!我应该在我原来的问题中更清楚。我在日志文件中需要的是时间戳、python 脚本的输出以及脚本完成所需的总时间。我可以跟踪脚本从 shell 脚本运行所需的时间吗?我可能只是 cat 的输出和我的 python 脚本。
猜你喜欢
  • 1970-01-01
  • 2022-08-17
  • 2017-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 2015-06-03
相关资源
最近更新 更多