前言
原文于2019.02.27发表自CSDN:https://blog.csdn.net/lianggx6/article/details/87981240 ,搬运至此。
正文
-
今天需要弄一个linux下的定时任务,考虑到用crontab去写,但是遇到很多问题,主要就是怎样在crontab的定时脚本中激活conda的环境,至于为什么这样做,接下来介绍一下背景
-
我们要运行的python脚本事先用setup打包成了一个包,然后利用click库,将要运行的函数添加到了命令行。也就是说,只要我安装了这个包,只需要运行一条我们规定的shell命令就好了,就不需要额外其他的python脚本。
-
于是,安装了包,解决了一堆路径依赖问题后,终于,输入命令行可以运行了,接下来就该设置定时任务了,这时候就发现一个操蛋的问题了。我们的这个包是在python2环境下的,每次运行前都要用 source activate python2(随便起的) 来激活环境再运行呀,但是我并没有在脚本里试过这种命令。想着反正shell脚本里都是shell语句,写着试一试吧。
-
版本一:
假设我们的shell的脚本文件命名为(task.sh), 先试着运行sh task.sh 没有反应.
#!/bin/sh
source activate python2
于是上网查了一下,在一篇博客中发现,如果想要在shell脚本中运行激活conda环境,不能使用sh,要使用source。也就是使用命令行 source task.h 来运行脚本。尝试之后,conda的python2环境成功被激活。
- 版本二:
于是 task.sh 保持不变,将crontab的设置修改如下:就是每周一到周五5:10时运行脚本,激活环境
10 5 * * 1-5 source /home/task.h
结果发现,虽然直接运行source /home/task.h是可以激活环境的,但是在crontab的定时任务中就是没有办法成功。
- 在查阅了许久的博客,想了许多的办法之后,想到去看一下crontab的日志吧。为什么不是一出问题就去看日志,因为我之前就没找到我这个服务器的cron日志啊,但是这次实在是没办法了,死马当活马医吧。至于后来怎么找到日志的,文末再讲。
- 在跟踪到cron的日志后,发现了在运行 source activate python2 这一句时,出现了报错:source: activate: file not found. 思索了一会之后,我突然明白了两个事情:
- source activate python2在激活环境时,本质上是通过运行activate这个文件实现的,只不过是在安装conda的时候把它添加到了环境变量,搞得我一直以为这是个怎么都可以用的shell命令行。
- 由于cron在定时运行脚本时,没有指定目录,所以最好使用绝对路径。
- 想到这里我立马找了一下activate的位置,路径是在/miniconda3/bin/activate , 这样,终于出来可以用的版本三。
- 版本三:
分别将 task.sh 和crontab修改如下:这样,成功利用cron定时脚本激活conda环境
#!/bin/sh
source /miniconda3/bin/activate ctp_task
!!!以上是shell脚本task.sh,以下是crontab的内容
10 5 * * 1-5 sh /home/task.h
- 最后一个问题,怎样找到的cron日志。这个其实我真的也是没有办法呀。去网上搜索cron日志在哪里,找到一个路径,就去看一看有没有。没有的话就接着搜博客,看看其他的博客提出的不同的路径,最后终于在/var/spool/mail路径下找到了各个用户cron的日志。(PS:我的系统是Linux的opensuse版本)。最后使用tail -f命令追踪日志,发现了问题。