今日linuxの下のタイミングタスクを作る必要があります.crontabで書くことを考慮しますが、多くの問題に直面しています.主にcrontabのタイミングスクリプトでcondaの環境をアクティブにする方法です.なぜそうするのか、次に背景を紹介します.
実行するpythonスクリプトをsetupでパッケージ化し、clickライブラリを使用して実行する関数をコマンドラインに追加しました.つまり、このパッケージをインストールすれば、私たちが規定したshellコマンドを実行するだけでいいので、他のpythonスクリプトは必要ありません. そこで、パッケージをインストールして、経路依存の問題を解決した後、やっと、コマンドラインを入力して実行することができて、次はタイミングタスクを設定するべきで、この時1つの操卵の問題を発見しました.私たちのこのパッケージはpython 2環境で、実行するたびにsource activate python 2(勝手に)で環境をアクティブにしてから実行しますが、スクリプトでこのコマンドを試したことはありません.どうせshellスクリプトにshell文が入っていると思って、書いてみましょう. バージョン1:shellのスクリプトファイルの名前を(task.sh)と仮定し、まずsh taskを実行してみます.shは反応しなかった. #!/bin/sh
source activate python2
そこでインターネットで調べてみると、shellスクリプトでconda環境をアクティブにするにはshを使用できないsourceを使用する必要があるというブログがありました.すなわち、コマンドラインsource taskを用いる.hでスクリプトを実行します.試した後、condaのpython 2環境が正常にアクティブになりました.
バージョン2:そこでtask.shはそのままcrontabの設定を以下のように変更します.毎週1~金曜日5:10にスクリプトを実行し、環境をアクティブにします.
10 5 * * 1-5 source /home/task.h
その結果、source/home/taskを直接実行することが分かった.hは環境をアクティブにすることができるが,crontabのタイミングタスクでは成功できない.
長い間ブログを調べて、いろいろな方法を考えた後、crontabのログを見に行きましょう.なぜ問題が発生するとログを見に行かないのか、私は前から私のサーバーのcronログを見つけていませんでしたが、今回は本当に仕方がありません.死んだ馬は生きている馬医になりましょう.その後どのようにログを見つけたのかについては、文末に話します. cronのログを追跡すると、source activate python 2という文を実行中にエラーが発生したことがわかりました:source:activate:file not found.しばらく考えた後、私は突然2つのことを理解しました: source activate python 2環境をアクティブにするときは、本質的にactivateというファイルを実行することによって実現されますが、condaをインストールするときに環境変数に追加しただけで、どうしても使えるshellコマンドラインだと思っていました. cronは、スクリプトをタイミングで実行する場合、ディレクトリが指定されていないため、絶対パスを使用することが望ましい. ここまで考えてすぐにactivateの位置を探しました.経路は/miniconda 3/bin/activateです.そうすれば、やっと使えるバージョン3が出てきます. バージョン3: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コマンドを使用してログを追跡し、問題が見つかりました. この半日、これに浪費して、やっと解決して、気持ちは少し爽やかです!