我正在 Linux VM 上工作,每天晚上 11:35 运行一个 cron 作业,运行一个调用 API 并将数据导出到 Google Cloud Storage 的 python 脚本。
我每天 11:35 都会在我的 Google 存储桶中进行每日导出,例如 2 月 10 日晚上 11:35 导出的以下文件 当我 crontab -l
在虚拟机上输入内容时,我得到的是:
35 22 * * * /home/worker/xxxx/yyyy/launch.sh
启动.sh
#!/bin/bash
BASE_PROJECT="/home/worker/xxxx/yyyy"
export PYTHONPATH="${BASE_PROJECT}"
export GOOGLE_USER_CREDENTIALS="${BASE_PROJECT}/credentials_red.json"
export PIPENV_PIPFILE="${BASE_PROJECT}/ingestion/Pipfile"
pipenv run python "${BASE_PROJECT}/ingestion/main.py"
GCS 上的文件:
从 12 月到 2 月 14 日,我的文件每天在 11:35 导出,此后,有 0 个文件导出到 Google Cloud Storage。我在ingestion/main.py
2 月 14 日做了一些更改,这可能是原因,但如果可能的话,我想知道问题是什么。我今天做的第一件事就是恢复ingestion/main.py
2 月 14 日以后的版本。我还做了什么:
该
ingestion/main.py
脚本正在调用外部 API。今天,我确实使用存储在虚拟机上的凭据从桌面调用了相同的 API,以查看问题是否与凭据有关。这不是问题,因为我能够取回数据。之后,我决定
launch.sh
直接从我的虚拟机运行它,它实际上工作了,因为我的所有文件都导入到 Google Cloud Storage 上(我已经恢复了ingestion/main.py
运行它时的旧版本。
我仍然不确定是什么原因导致了这个问题,我运行了sudo grep CRON var/log/syslog
但只有几行。有没有办法获得有关为什么我的 cronjob 没有运行的更多信息?
答案1
输出(正常或错误)(如果有)通过邮件发送给运行脚本的 Linux 用户。
如果您的虚拟机未配置为广泛发送邮件,或者您没有设置.forward
将邮件从 Linux 中继到互联网,则邮件可能仍然存在,请尝试mail
从命令行。
如果您喜欢自行发送垃圾邮件,只需添加
[email protected]
作为 crontab 的第一行。
答案2
更改您crontab
的重定向脚本的任何输出到您的主目录中的日志文件(或其他位置,如果您有权限并希望这样做)。由于您的cron
工作正在运行非交互式外壳,stdin
然后stdout
转到“位存储桶”( /dev/null
) - 如果出现错误,这将没有帮助。
尝试这个修改后的crontab
条目:
35 22 * * * /home/worker/xxxx/yyyy/launch.sh >> /home/worker/cronlog.txt 2>&1