【问题标题】:Crontab / Launchd: OS X User Permissions, Environment Variables, Python VirtualenvsCrontab / Launchd:OS X 用户权限、环境变量、Python Virtualenvs
【发布时间】:2013-07-07 22:41:45
【问题描述】:

我正在尝试从虚拟环境中自动在我的 Mac 上每分钟运行一个 python 脚本。我确信我没有正确理解权限、路径和环境变量,这使我无法弄清楚这一点。

我是启用了 root 权限的管理员用户。我运行 HomeBrew、PIP 和 Virtualenv 来管理不同项目的 python 包和虚拟环境。

我想每 60 秒执行以下操作:

$ source /.virtualenvs/myenvironment/bin/activate
$ cd ~/desktop/python/
$ python myscript.py
$ deactivate  

我试过了:

(a) 为 Launchd 编写我自己的 plist - 我相信这些文档格式正确。

(b) 为您管理 Launchd 守护程序和代理的程序(Launch Control 和 Lingon)。

(c) 我尝试过简单地编辑 crontab(仅在我使用 sudo 命令时才允许)。

python 脚本在命令上工作,从在线资源中提取数据并将其存储在 sqlite 表中。我可以告诉 cron 没有运行,因为 sqlite db 没有被触及。

任何想法将不胜感激。

【问题讨论】:

  • 日志(/var/log/system.log)说什么?您是否检查了 stdout/stderr(在您的工作定义中设置 StandardOutPathStandardErrorPath 键)?

标签: python macos cron crontab launchd


【解决方案1】:

您没有确切地说出您使用 launchd 和 cron 尝试了什么,但我敢打赌您没有正确使用它们中的任何一个。两者都面向运行单个、隔离的命令(/programs),而不是 shell 命令序列。虽然可以使用单个 cron 作业或启动项来执行此操作,但它会很混乱。最简单的方法是编写一个执行您想要的序列的 shell 脚本(确保在开头包含一个 shebang,并使用 chmod +x /path/to/script 启用脚本的执行权限),然后从 cron 或 launchd 运行它:

#!/bin/bash
source /.virtualenvs/myenvironment/bin/activate
cd ~/desktop/python/
python myscript.py
deactivate

我不建议使用 Automator 来包装命令序列;它是为基于 GUI 的脚本而设计的,可能无法在纯后台作业中正常工作。

【讨论】:

  • 您提供的代码是我在 Launchd 中使用我的 plist 脚本指向的 shell 文件的精确副本。它没有用。我相信因为使用 HomeBrew 和 virtualenv 来管理 python 安装有不同的路径变量(但老实说我不知道​​)。
【解决方案2】:

我也遇到过同样的问题,最近解决了。 Look here 我采取的步骤。基本上它处理需要 PYTHONPATH 的 shell,而不仅仅是 PATH。

【讨论】:

    【解决方案3】:

    所以我仍然不确定为什么我不能配置 Launchd 或 Crontab 来为我工作:我仍然怀疑它与环境变量有关。

    如果其他人在这个问题上遇到困难,我建议创建一个 Automator 应用程序来运行您想要运行的 shell 脚本,然后使用 Lingon 或 Launch Control 以您想要的任何频率运行 Automator 应用程序文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-02
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      • 2015-08-20
      • 2015-09-16
      • 1970-01-01
      • 2021-11-07
      相关资源
      最近更新 更多