My python crontabでスクリプトが実行されていません。
これを最上部のpythonスクリプトに配置しました:
_#!/usr/bin/python
_
私はこれを試しました:
_chmod a+x myscript.py
_
私のcrontab -eに追加されました:
_
Shell=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
_
_* * * * * /home/me/project/myscript.py
_ </ code>
/ var/log/cronファイルには次のように書かれています:Sep 21 11:53:02 163-dhcp /USR/SBIN/CROND[2489]: (me) CMD (/home/me/project/myscript.py)
しかし、SQLデータベースをチェックしても何も変わっていないため、スクリプトは実行されていません。ターミナルで次のように直接実行すると:
_python /home/me/project/myscript.py
_
正しい結果が得られます。
これはmyscript.pyです。
_#!/usr/bin/python
import sqlite3
def main():
con = sqlite3.connect("test.db")
with con:
cur = con.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS testtable(Id INTEGER PRIMARY KEY, Name TEXT)")
cur.execute("INSERT INTO testtable(Name) VALUES ('BoB')")
cur.execute("SELECT * FROM testtable")
print cur.fetchall()
if __name__ == "__main__":
main()
_
編集:コメントごと:はい、_/usr/bin/python
_が存在します。 _/home/me/project/myscript.py
_を使用してpythonスクリプトを直接実行することもできます。_/usr/bin/python /home/me/project/myscript.py
_が機能します。
入力するとどうなりますか
/home/me/project/myscript.py
シェルに?
Crontbbコマンドで/usr/bin/python
を明示的に使用できますか?
test.db
またはcd
への正しいディレクトリへの絶対パスを使用して、pythonスクリプトを実行できますか?
これは、デバッグステートメントをpythonに入れて、いくつかのデータをログに記録するのに役立ちます。Crontabはデバッグが非常に難しい場合があります。
pythonインタープリターを見つけることができないため、スクリプトが起動しない可能性があります。Crontab環境は、使用しているシェル環境とは非常に異なる場合があります。検索パスは大幅に異なる場合があります。また、 、crontabがスクリプトのみを開始することを期待しながら、pythonインタープリターを明示的に開始することによってスクリプトをテストします。この行を私のpythonスクリプト:
\#!/bin/env python
この行は、検索パスにある限り、どのディレクトリにインストールされているかに関係なく、インタープリターを見つけるのに役立ちます。
インターネットには多くの半分の答えがありますので、誰かを救うためにこれをキャプチャすると思いました。
まず、cronjobは、これがどこで失敗しているかを伝えるのが貧弱です。次のようなログファイルにstderr出力を送信することをお勧めします。
# m h dom mon dow command
* * * * * /path/to/your_file.sh >> out.txt 2>&1
これはユーザーとしてコマンドを実行している可能性が高いため、ログファイルのホームディレクトリを確認してください。このスクリプトは毎分実行されるため、デバッグに適しています。
次の問題は、おそらくパスの問題があることです...スクリプトがホームディレクトリから実行しようとしている可能性があるためです。このスクリプトは、現在のディレクトリを設定し、ファイルにエコーし、プログラムを実行します。
これを試して :
#!/bin/sh
cd "$(dirname "$0")";
CWD="$(pwd)"
echo $CWD
python your_python_file.py
これにより、他の人のデバッグ時間が節約されることを願っています!!!
通常、このようなcrontabの問題は、PATH環境変数が通常のユーザーのPATH環境よりも制限/異なるために発生します。シェルはPATH環境を使用して実行可能ファイルを見つけるため(たとえば、シェルプロンプトで「python」と入力すると/ usr/bin/pythonは/ usr/binにあります)、/ usr /などの一般的な場所がPATHにない場合binまたは/ usr/sbin、cronジョブは失敗します。これは私を何度も噛みました。単純な修正方法は、必要なコマンドを実行する前に、crontabファイルの先頭近くに自分で明示的にPATHを設定することです。したがって、通常どおりにcrontabを編集し、上部付近に次のようなものを追加します(バイナリが以下のいずれかのパスにない場合は、コロンの後に追加する必要があります)。
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
または、crontabのバイナリとスクリプトへの絶対パスを使用します。
pythonにanacondaを使用している場合、使用するパスは次のようになります。
/home/username/anaconda3/bin/python test.py
これを試して
* * * * * cd <directory_where_python_file_is> && bin/app etc/app_defaults.yaml
Cronにパスの問題があります。したがって、pythonファイルでディレクトリに移動すると、cronはチャームのように機能します!
私も同じ問題を抱えていました。手動で実行されたスクリプトは機能していましたが、crontabでは上記のオプションはまったく機能していませんでした。スクリプトを/ home/user/script_directory /から/ opt/scripts /に移動し、動作し始めました。問題の考えられる原因は、ホームディレクトリにあるサブフォルダーへのアクセス(読み取り)アクセス許可です。
これを処理する最も簡単な方法は、シェルスクリプトの先頭にpythonインストールのパスをPATHに追加することです。
#!/usr/bin/env bash
export PATH="{path to your python installation}:$PATH"
python {python_file_name}.py
@Shargorsが言ったように、あなたはそれをテストすることができます
env -i /bin/bash --noprofile --norc
通常は、crontabで使用されるpythonがシェルで使用するものと異なるためです。これを解決する最も簡単な方法は次のとおりです。
$ which python # it may be "python3" or something else /usr/bin/python
* * * * * /usr/bin/python test.py
また、env -i /bin/bash --noprofile --norc
シェルでは、crontabで使用される環境と同じ環境を使用できます。これはデバッグに非常に役立ちます。
時々私は同じ問題に直面しています。ここでアドバイスされていることを試しても、結果が得られない場合があります。
そこで、次のように「トリガー」bashスクリプトを書き始めます(trigger.shと名付けましょう)。
#!/bin/bash
/full_path/python_script.py
そして、crontabからtrigger.shを呼び出していますが、すべて問題ありません。
編集:もちろん、次のことを忘れないでください(実行権を与える):
$chmod +x python_script.py
$chmod +x trigger.sh
Crontabに入れてみてください:
* * * * * python /path/to/your/script.py
のではなく
* * * * * /path/to/your/script.py
また、Shebangラインは#!/usr/bin/env python
一部の環境では。 envは実行可能ファイルであり、「$ which env
"。
ここでの答えは問題と解決策を明確に示していますが、私が助けてくれた別の答えを追加したかったのです。
pythonスクリプトがデータベースを呼び出している場合、cron env内で適切にdbに接続できることを確認してください(cron env-> https:// askubuntuを識別するために.com/questions/23009/reasons-why-crontab-does-not-work )。シェルから実行するファイルがありましたが、データベース内からrootとしてデータベースに接続しない限り、crontabとしてではありませんpythonスクリプト。