Программа Python2.7 не работает при запуске crontab - PullRequest
0 голосов
/ 29 ноября 2018

Настройка оборудования (компьютер и т. Д.)

  • Сервер Ubuntu 18.04.1
  • Преобразователь последовательного интерфейса в USB с 8 портами

Версия Python

  • 2.7.15r1

Описание программы Python

При запуске программыЧтобы создать несколько потоков:

  1. Создайте один поток для сервера Modbus.
  2. Запустите 1 поток для каждого подключенного последовательного порта (/dev/ttyUSBn) и начните чтение данных.

Объяснение проблемы

Когда я запускаю сценарий с помощью обычной команды (python2.7 myProgram.py), он работает, поэтому сервер Modbus запускается, и я могу прочитать значение, иЯ также вижу мигание usb-serial конвертера на светодиодах TX-RX .Если я проверю прочитанные данные, они верны, поэтому программа работает правильно.

Проблема возникает, когда я настраиваю задание crontab, которое запускает мой скрипт python!

Запуск сервера Modbusправильно, но я не вижу, чтобы светодиоды USB-последовательного конвертера мигали, а программа python не печатает прочитанные данные.Это означает, что программа не работает на «последовательной» стороне.

Для создания задания я использовал следующие команды:

  1. crontab -e
  2. выбранnano (опция по умолчанию)
  3. В конце файла добавлена ​​команда cron: @reboot /usr/bin/python2.7 /myProgram.py

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

В помощь вам:

У меня также естьпопытался запустить его с помощью **systemctl**, проблема та же.При загрузке служба запускается, и если я проверяю ее, я могу прочитать: Active(running), но программное обеспечение не читает с последовательного порта.

Вопросы:

  • Как я могу это решить?
  • Что-то не так с заданием crontab?
  • Возможно, задание crontab не может получить доступкаталог / dev /?Как я могу решить это?

Я очень смущен этим, я надеюсь, что вопрос правильно создан и отформатирован.


РЕДАКТИРОВАТЬ 30/11 /18:


Я удалил команду crontab и создал службу для запуска программы, используя эту процедуру.

Если я запускаю команду: service supervision start Я вижу, что процесс работает правильно и на htop У меня только 4 процесса.

htop output

service status output

В этом случае программа не читает с последовательного порта, но сервер Modbus работает.Вы можете видеть, что у меня всего 4 процесса и загрузка процессора слишком высока.

Если я запускаю его вручную с помощью команды: python2.7 LibSupervisione.py

Вывод команды htop: outupt of working program

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

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Возможно, вашему сценарию требуются консоль или некоторые переменные окружения, но при запуске процесса systemd у вас их нет автоматически.

Самый простой способ - добавить /usr/bin/bash -c "your command" в системном блоке в поле ExecStart, чтобы включить оболочку, подобную среде, например:

ExecStart=/bin/bash -c "/usr/bin/python2.7 /myProgram.py" 

WorkingDirectory=yourWorkingDir 

Зачем вам нужно использоватьхрон?Вместо этого используйте системный таймер.

0 голосов
/ 30 ноября 2018

Если бы вы могли запустить свой код с помощью службы, например, такой: sudo service <service-name> start и получить хороший статус, используя sudo service <serivice-name> status, вы можете проверить его в crontab -e следующим образом (запускать каждые 5 минут для проверки):

*/5 * * * * service <service-name> start
*/10 * * * * service <service-name> stop

Затем с помощью @rebote после с вышеупомянутым тестом.


ИЛИ:

Наконец, если вы хотите запустить свой код / ​​службу при запуске системы,сделайте это вместо cron jon:

Отредактируйте файл rc.local с помощью редактора с разрешением sudo, затем:

#!/bin/sh -e

# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.


service <service-name> start

exit 0

[ NOTE ]:

Это процедура создания service из вашего кода.

...