web-dev-qa-db-ja.com

Crontabでmy pythonスクリプトが実行されていません

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_が機能します。

29
user1636922

入力するとどうなりますか

/home/me/project/myscript.pyシェルに?

Crontbbコマンドで/usr/bin/pythonを明示的に使用できますか?

test.dbまたはcdへの正しいディレクトリへの絶対パスを使用して、pythonスクリプトを実行できますか?

これは、デバッグステートメントをpythonに入れて、いくつかのデータをログに記録するのに役立ちます。Crontabはデバッグが非常に難しい場合があります。

23
dm03514

pythonインタープリターを見つけることができないため、スクリプトが起動しない可能性があります。Crontab環境は、使用しているシェル環境とは非常に異なる場合があります。検索パスは大幅に異なる場合があります。また、 、crontabがスクリプトのみを開始することを期待しながら、pythonインタープリターを明示的に開始することによってスクリプトをテストします。この行を私のpythonスクリプト:

\#!/bin/env python

この行は、検索パスにある限り、どのディレクトリにインストールされているかに関係なく、インタープリターを見つけるのに役立ちます。

14
shargors

インターネットには多くの半分の答えがありますので、誰かを救うためにこれをキャプチャすると思いました。

まず、cronjobは、これがどこで失敗しているかを伝えるのが貧弱です。次のようなログファイルにstderr出力を送信することをお勧めします。

Crontabコマンド:

# 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

これにより、他の人のデバッグ時間が節約されることを願っています!!!

10
JJSanDiego

通常、このような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のバイナリとスクリプトへの絶対パスを使用します。

7
JJC

pythonにanacondaを使用している場合、使用するパスは次のようになります。

/home/username/anaconda3/bin/python test.py
2
Inder

これを試して

* * * * * cd <directory_where_python_file_is> && bin/app etc/app_defaults.yaml

Cronにパスの問題があります。したがって、pythonファイルでディレクトリに移動すると、cronはチャームのように機能します!

2
Taras Vaskiv

私も同じ問題を抱えていました。手動で実行されたスクリプトは機能していましたが、crontabでは上記のオプションはまったく機能していませんでした。スクリプトを/ home/user/script_directory /から/ opt/scripts /に移動し、動作し始めました。問題の考えられる原因は、ホームディレクトリにあるサブフォルダーへのアクセス(読み取り)アクセス許可です。

2
charkh

これを処理する最も簡単な方法は、シェルスクリプトの先頭に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
1
Hamed Moghaddam

通常は、crontabで使用されるpythonがシェルで使用するものと異なるためです。これを解決する最も簡単な方法は次のとおりです。

  1. シェルで使用するpythonを取得します。

$ which python # it may be "python3" or something else /usr/bin/python

  1. crontabファイルで特定のpythonを使用:

* * * * * /usr/bin/python test.py

また、env -i /bin/bash --noprofile --norcシェルでは、crontabで使用される環境と同じ環境を使用できます。これはデバッグに非常に役立ちます。

1
Brian

時々私は同じ問題に直面しています。ここでアドバイスされていることを試しても、結果が得られない場合があります。

そこで、次のように「トリガー」bashスクリプトを書き始めます(trigger.shと名付けましょう)。

#!/bin/bash

/full_path/python_script.py

そして、crontabからtrigger.shを呼び出していますが、すべて問題ありません。

編集:もちろん、次のことを忘れないでください(実行権を与える):

$chmod +x python_script.py
$chmod +x trigger.sh
0
Brainiac
  • Cronユーザー(スクリプトが失敗した場合)と端末ユーザー(スクリプトが成功した場合)は同じですか?
  • Cron Job Log-How to Log? で説明されているように、ジョブ出力をいくつかのファイルにリダイレクトできますか?それが役立つかどうかを確認できました。
0
Veerabahu

Crontabに入れてみてください:

* * * * * python /path/to/your/script.py

のではなく

* * * * * /path/to/your/script.py

また、Shebangラインは#!/usr/bin/env python一部の環境では。 envは実行可能ファイルであり、「$ which env "。

0
xbello

ここでの答えは問題と解決策を明確に示していますが、私が助けてくれた別の答えを追加したかったのです。

pythonスクリプトがデータベースを呼び出している場合、cron env内で適切にdbに接続できることを確認してください(cron env-> https:// askubuntuを識別するために.com/questions/23009/reasons-why-crontab-does-not-work )。シェルから実行するファイルがありましたが、データベース内からrootとしてデータベースに接続しない限り、crontabとしてではありませんpythonスクリプト。

0
Minnow