Crontab не выполняет скрипт Python? - программирование
Подтвердить что ты не робот

Crontab не выполняет скрипт Python?

Мой скрипт на 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

Мой файл /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 существует. Я также могу запустить скрипт Python напрямую, используя только /home/me/project/myscript.py. /usr/bin/python /home/me/project/myscript.py работает. Так я не верю, что это причина?

4b9b3361

Ответ 1

Что происходит при вводе

/home/me/project/myscript.py в оболочку?

Можете ли вы явно использовать /usr/bin/python в своей команде crontbb?

Можете ли вы использовать абсолютный путь к вашим test.db или cd в правильный каталог, а затем выполнить свой python script?

Это полезно для того, чтобы иметь инструкции debug в вашем python и записывать некоторые данные. Crontab может быть очень сложным для отладки.

Ответ 2

Возможно, что скрипт не запускается, потому что он не может найти интерпретатор python. Среда Crontab может сильно отличаться от среды оболочки, которую вы используете. Пути поиска могут существенно отличаться. Кроме того, вы тестируете свой скрипт, явно запуская интерпретатор python, в то время как ожидаете, что crontab запустит только скрипт. Я поместил эту строку вверху моих скриптов на Python:

\#!/bin/env python

Эта строка поможет найти интерпретатор независимо от того, в каком каталоге он установлен, если он находится в пути поиска.

Ответ 3

В Интернете есть много ответов на половину, поэтому я подумал, что захвачу это, чтобы сохранить кого-то еще некоторое время.

Во-первых, cronjob плохо работает, говоря вам, где это происходит. Я рекомендую отправить вывод stderr в файл журнала следующим образом:

Команда Crontab:

# m h  dom mon dow   command
* * * * * /path/to/your_file.sh >> out.txt  2>&1

Поскольку это, скорее всего, запускает команду как пользователь, проверьте домашний каталог для файла журнала. Обратите внимание, что это script выполняется каждую минуту, что хорошо для отладки.

В следующей проблеме, вероятно, есть проблема с пути... поскольку script, вероятно, пытается выполнить из вашего домашнего каталога. Этот script устанавливает текущий каталог, echos его в файл и затем запускает вашу программу.

Попробуйте следующее:

Script Файл

#!/bin/sh
cd "$(dirname "$0")";
CWD="$(pwd)"
echo $CWD
python your_python_file.py

Надеюсь, это избавит кого-то еще от времени отладки!!!

Ответ 4

Как правило, проблемы crontab, подобные этой, вызваны тем, что переменная среды PATH более ограничена/отличается от обычной среды PATH пользователя. Поскольку ваша оболочка использует среду PATH для поиска исполняемого файла (например,/usr/bin/python находится в /usr/bin при вводе "python" в приглашении оболочки), когда в PATH отсутствуют общие местоположения, например /usr/bin или /usr/sbin, ваша работа cron не удастся. Это укусило меня много раз. Простое решение состоит в том, чтобы просто явно указать PATH в верхней части файла crontab перед любыми командами, которые в этом нуждаются. Итак, просто отредактируйте crontab как обычно и добавьте что-то вроде этого вверху (если ваш двоичный файл не указан ни в одном из приведенных ниже путей, вам нужно добавить его после двоеточия):

PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

В качестве альтернативы, просто используйте абсолютные пути к вашим двоичным файлам и сценариям в crontab.

Ответ 5

У меня была такая же проблема. Несмотря на то, что работающий script был выполнен вручную, в crontab никакие параметры, упомянутые выше, не работали вообще. Я переместил свой script из/home/user/script_directory/to/opt/scripts/и начал работать. Возможной причиной проблемы должны быть разрешения доступа (чтения) к подпапке, расположенной в домашнем каталоге.

Ответ 6

Попробуйте это

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

Существует некоторая проблема с путём cron. Поэтому, когда вы переходите в каталог с файлом Python, cron работает как шарм!

Ответ 7

Если вы используете anaconda для python, то путь для использования будет:

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

Ответ 8

Иногда мне приходится сталкиваться с такой же проблемой. Независимо от того, что я пробую, как мне посоветовали, я не могу получить результат.

Итак, я начинаю писать "trigger" bash script следующим образом (пусть назовите его trigger.sh):

#!/bin/bash

/full_path/python_script.py

И я вызываю trigger.sh из crontab, и все в порядке.

EDIT: Конечно, не забудьте сделать следующее (дайте правильное исполнение):

$chmod +x python_script.py
$chmod +x trigger.sh

Ответ 9

Самый простой способ справиться с этим - добавить свой путь установки python к PATH в верхней части оболочки script. Что-то вроде:

#!/usr/bin/env bash
export PATH="{path to your python installation}:$PATH"
python {python_file_name}.py

Как @Shargors сказал, что вы можете проверить его на

env -i /bin/bash --noprofile --norc

Ответ 10

Обычно это потому, что питон, используемый crontab, отличается от того, который вы используете в оболочке. Самый простой способ решить эту проблему:

  1. получите питон, который вы используете в оболочке:

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

  1. используйте этот конкретный питон в файле crontab:

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

Также хочу отметить, что использование env -i /bin/bash --noprofile --norc в оболочке позволяет вам иметь ту же среду, что и crontab, и это очень полезно для отладки.

Ответ 11

Попытайтесь вставить свой crontab:

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

а не

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

Также в некоторых средах строка shebang #!/usr/bin/env python. env - это исполняемый файл, и вы должны знать, где он живет с "$ which env".

Ответ 12

  • Не работает ли пользователь cron (где script) и пользователь терминала (когда script успешно) совпадают?
  • Можете ли вы перенаправить вывод задания на какой-либо файл, как указано в Журнал заданий Cron - как зарегистрироваться?. Мы могли видеть, помогает ли это.

Ответ 13

Хотя ответы здесь четко определяют проблему и решение, я хотел добавить еще один ответ, который помог мне.

Если ваш python script вызывает базу данных, то убедитесь, что вы правильно подключаетесь к db внутри cron env (чтобы определить cron env → https://askubuntu.com/questions/23009/reasons-why-crontab-does-not-work). У меня был файл, который запускался бы из оболочки, но не как crontab, если я не подключился к базе данных как root из python script.

Ответ 14

Я работал над проектом, который включает в себя paramiko lib, когда я запускаю Check_.py из cmdlin, он работает отлично, но когда я устанавливаю crontab, он завершается с ошибкой no module name paramiko.

Итак, чтобы сделать это коротким:
 - были установлены две разные версии Python 3.7 и 2.4, поэтому я использовал whreris python3, чтобы найти путь питона /usr/local/bin/python3.7m, поэтому замена python на путь решит проблему.

Пример

* * * * * cd /home/MKhair/hlthchk/BR/ && /usr/local/bin/python3.7m /home/MKhair/hlthchk/BR/Check_.py
* * * * * cd [ path-to-the-script-dir] && [path-to-python] [path-to-the-script]