Назад | Перейти на главную страницу

Невозможно запустить скрипт python3 в CentOs7 [с python2.7] через cronjob

Я все утро пытался разобраться с этой проблемой.

У меня простой crawler.py файл, который содержит код, который может работать только под python3, а точнее под python3.3 evenrionment

Теперь моя машина CentOs7 по умолчанию поставляется с python2.7, поэтому я вынужден переключиться на python3 для запуска моего скрипта, например:

scl enable python33 bash

пример.

[root@bt py]# python -V
Python 2.7.5
[root@bt py]# scl enable python33 bash
[root@bt py]# python -V
Python 3.3.2

как видите, он изменил версию, после чего я могу запустить простой запуск crawler.py без проблем так просто, как python crawler.py.

Но мне нужен этот файл python для запуска через cron в определенное время недели.

Проблема в том, что как только я выхожу из своего VPS, python2.7 становится по умолчанию, и если cron запускает его, он не запускается. Для этого я подумал, что должен использовать двоичный файл python3, а не просто python .. Итак, я попробовал со следующим

/opt/rh/python33/root/usr/bin/python3.3 crawler.py 

Но похоже, что двоичный файл не отображается, если вы не запустите scl enable python33 bash

Вы можете убедиться в этом сами,

[root@bt ~]# whereis python
python: /usr/bin/python /usr/bin/python2.7 /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/include/python2.7 /usr/share/man/man1/python.1.gz
[root@bt ~]# scl enable python33 bash
[root@bt ~]# whereis python
python: /usr/bin/python /usr/bin/python2.7 /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/include/python2.7 /opt/rh/python33/root/usr/bin/python3.3m /opt/rh/python33/root/usr/bin/python3.3-config /opt/rh/python33/root/usr/bin/python3.3m-config /opt/rh/python33/root/usr/bin/python /opt/rh/python33/root/usr/bin/python3.3 /usr/share/man/man1/python.1.gz

Бинарный файл появляется только после вызова python33 через scl. Итак, я все время говорю cron, чтобы он как-то выполнял scl enable python bash команда, поэтому мои скрипты python3 работают без проблем.

Итак, я создал файл bash как

#!/bin/bash 
$(scl enable python33 bash)
python crawler.py 
# alternatively I tried the below solution also. 
# /opt/rh/python33/root/usr/bin/python3.3 crawler.py 

Но как только bash выполняет первую команду, он выходит из процесса или порождает другие процессы. даже попытался поставить это

scl enable python33 bash && python crawl.py 

также

scl enable python33 bash && /opt/rh/python33/root/usr/bin/python3.3 crawl.py 

Итак, в двух словах, похоже, нет возможности запустить скрипт python3 через cronjob, если у вас есть что-то, кроме python3 по умолчанию на вашем компьютере.

Если я правильно понимаю, вы хотите использовать cron для запуска сценария bash, в котором вызов python приводит к версии scl'ed python33.

Я только что реализовал и протестировал это здесь, в системе Scientific Linux с python33 из scl, как и в вашем случае.

Создайте сценарий bash:

$ cat /home/username/mybashfile.sh 
#!/bin/bash
echo `date` >> /home/username/pythonversionfile
python --version >> /home/username/pythonversionfile 2>&1

и создайте запись cron следующим образом:

* * * * * /usr/bin/scl enable python33 'bash -c /home/username/mybashfile.sh'

Это означает, что вы вызываете scl для использования среды python33, которая вызывает bash, непосредственно с вызовом скрипта, который вы создали ранее.

Это прекрасно работает и дает мне следующий результат:

$ tail pythonversionfile 
Wed Mar 30 17:36:01 CEST 2016
Python 3.3.2
Wed Mar 30 17:37:02 CEST 2016
Python 3.3.2
Wed Mar 30 17:38:01 CEST 2016
Python 3.3.2
Wed Mar 30 17:39:01 CEST 2016
Python 3.3.2
Wed Mar 30 17:40:01 CEST 2016
Python 3.3.2

Итак, вы можете видеть, что сценарий bash вызывается cron каждую минуту, а внутри сценария bash среда правильно настроена, так что python приводит к вызову python 3.3.2.

Cronjob (пример):

0 1 * * * scl enable python33 'python /path/to/crawl.py'

Синтаксис scl:

scl enable software_collection ... 'команда ...'

Источник