【问题标题】:Python script works manually, but not from cron jobPython脚本手动工作,但不是来自cron作业
【发布时间】:2018-10-08 19:02:30
【问题描述】:

我有一个 Python 脚本,它可以从如下环境变量中获取一条数据:

password = os.environ["SomePassword"]

当我手动运行脚本时,脚本按预期工作,但是当脚本在 shell 文件中并由 cron 作业运行时,它在该行失败并显示“KeyError”,我认为它没有找到变量。

此外,当我以运行 cron 作业的同一用户身份运行以下任何操作时,我会看到预期的变量。

echo $SomePassword
env
printenv

发生了什么,我该如何解决?

更新: 我能够通过阅读建议的重复问题来解决此问题 - 但是,该问题并未描述其他人可能感兴趣的根本问题。

【问题讨论】:

  • 谢谢,那一定是我没看过的一篇文章。这导致我将它添加到我的 bash 脚本“source /home/myuser/.profile”中并且有效。我仍然想了解这是如何工作的。我使用运行 cron 作业的同一用户手动运行它,它运行良好 - bash 脚本和 cron 作业有什么不同?
  • Cron 作业由对您的环境一无所知的系统用户运行,即不读取您的 .bashrc 或 .profile。因此,默认情况下,当 cron 运行时,您在登录会话期间放置的任何内容都不会出现。 man 5 crontab 会告诉你存在哪些环境变量以及很多有用的信息。
  • crontab 是在 UserX 下设置和运行的,所以我很奇怪它看不到自己的配置文件。当我 sudo 进入 UserX 时,我可以看到变量。
  • cron 由root 用户运行。 su 到 root 和 chck 如果你的环境变量在那里,他们不应该。

标签: bash python-3.x


【解决方案1】:

这是因为环境变量没有声明和赋值。

当你手动运行它时它会起作用,因为当你登录时,各种环境脚本会运行(例如 ~/.bashrc、~/.bash_profile,可能还有其他类似 /etc/bashrc)并且他们已经这样做了。

您可以通过创建一个简单的脚本来测试这一点,该脚本将所有环境变量保存到一个文件中并使用 cron 进行调度。运行后,检查文件中的内容。

【讨论】:

    猜你喜欢
    • 2015-12-13
    • 2019-10-21
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2014-09-09
    • 1970-01-01
    • 2014-09-06
    相关资源
    最近更新 更多