我设置了一个 Anaconda Python 虚拟环境,如果我在激活该虚拟环境时运行我的项目,一切运行良好。
但是我有一个配置为每小时运行一次的 cronjob。我将输出通过管道传输到日志,因为它没有正确运行。
crontab -e:
10 * * * * bash /work/sql_server_etl/src/python/run_parallel_workflow.sh >> /home/etlservice/cronlog.log 2>&1
Run Code Online (Sandbox Code Playgroud)
我在 cronlog.log 中收到此错误:
Traceback (most recent call last):
File "__parallel_workflow.py", line 10, in <module>
import yaml
ImportError: No module named yaml
Run Code Online (Sandbox Code Playgroud)
这表明在没有激活虚拟环境的情况下,cronjob 以某种方式不运行文件。
为了解决这个问题,我在/home/user/.bash_profile文件中添加了一行:
conda activate ~/anaconda3/envs/sql_server_etl/
Run Code Online (Sandbox Code Playgroud)
现在,当我登录时,环境会自动激活。
但是,问题仍然存在。
我又尝试了一件事。我更改了 cronjob,(我也在 cronjob 运行的 bash 文件中尝试了这个)以在每次运行时明确手动激活环境,但无济于事:
10 * * * * conda activate ~/anaconda3/envs/sql_server_etl/ && bash /work/sql_server_etl/src/python/run_parallel_workflow.sh >> /home/etlservice/cronlog.log 2>&1
Run Code Online (Sandbox Code Playgroud)
当然,我试过的任何东西都没有修复它。我真的对 linux 一无所知,所以也许我需要改变一些明显的东西。
那么,无论如何要指定 cronjob 应该在虚拟环境下运行?
我在这里有一些文件,我使用 python 模块 pysftp 复制到这个 linux box:
[jm@spartan tf]$ ls -la
total 0
drwxrwxrwx. 3 jm jm 69 Aug 14 13:50 .
drwxrwxrwt. 9 root root 238 Aug 14 13:49 ..
-rwxrwxrwx. 1 jm jm 0 Aug 14 13:49 .\gitkeep
drwxrwxrwx. 2 jm jm 6 Aug 14 13:50 .\innerfile
-rwxrwxrwx. 1 jm jm 0 Aug 14 13:50 .\innerfile\gitkeep
[jm@spartan tf]$ rm .\gitkeep
rm: cannot remove ‘.gitkeep’: No such file or directory
Run Code Online (Sandbox Code Playgroud)
它们是隐藏的,所以我仍在尝试弄清楚如何复制然后再将它们隐藏起来,但同时我想删除它们,但我无法删除。这里发生了什么?
我在 CentOS 7 上。