Linux下使用crontab定時激活conda虛擬python環境


前言

原文於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. 思索了一會之后,我突然明白了兩個事情:
  1. source activate python2在激活環境時,本質上是通過運行activate這個文件實現的,只不過是在安裝conda的時候把它添加到了環境變量,搞得我一直以為這是個怎么都可以用的shell命令行。
  2. 由於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命令追蹤日志,發現了問題。
這小半天,就浪費在這個上了,終於解決了,心情有點爽!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM