2016-03-14 1 views
2

Я могу запустить свой скрипт Python в фоновом режиме для управления двумя сервомашинами, автоматически запуская сценарий при загрузке с помощью sudo crontab -e. Я изменил сценарий, поэтому теперь я постоянно записываю текущую позицию сервоприводов в файл horz.txt и vert.txt и используя эти файлы для инициализации степпиков в их исходное положение, чтобы снова найти домашнюю позицию после потери мощности. Скрипт отлично работает с кодом horz.txt и vert.txt, который я добавил, когда я вручную запускал скрипт из командной строки на черном экране с использованием sudo python mystepper6.py, но он не запускается автоматически при запуске, и он не запускается автоматически показывается, когда я запускаю ps ax в командной строке. Я добавил немного дополнительного кода, чтобы покачивать сервомашины до запуска основной программы, и сервоприводы автоматически покачиваются, как запрограммировано в sudo crontab -e, но затем он просто останавливается и не будет продолжать находить исходную позицию. Кажется, что-то с новым кодом, но я не знаю, что это может быть. Моя строка sudo crontab -e - @reboot (sleep2; python /home/pi/mystepper6.py) &. Ниже приведен скрипт для mystepper6.py.Crontab больше не работает Raspberry Pi Python скрипт в фоновом режиме, но все еще работает вручную

Сценарий ниже был сокращен, чтобы показать соответствующие строки из-за ограниченного пространства, доступного в этом сообщении. Перезагрузка sudo ведется без сообщения об ошибке рядом с нижним, где прокомментировано «перемещение в исходное положение» (оно не перемещается). Я могу печатать скобки regv и adjusth до этой точки, поэтому переменным надлежащим образом присваивается значение из файлов .txt в этой точке. Когда я вручную запускаю mystepper6.py из командной строки, он работает отлично.

Я потратил waaay слишком много часов на эту проблему и купил две электронные книги безрезультатно. Пожалуйста помоги.

import RPi.GPIO as gpio   # import library RPi.GPIO gpio=use general   purpose input output pin names 
import time        # import time library 

PINSh = [27,10,18,23]   # variable 'PINS' holds a list of gpio pin numbers 
SEQAh = [(27,),(10,),(18,),(23,)] 
PINSv = [4,17,22,24]   # variable 'PINS' holds a list of gpio pin numbers 
SEQAv = [(4,),(17,),(22,),(24,)] 

DELAY = 0.01       # time between motor steps (too small of a number then the motor stalls) 
alpha = 140        # horizontal full scale viewing angle in motor counts 128 counts = 360 degrees 
beta = 30        # was 15 vertical full scale viewing angle in motor counts 128 counts = 360 degrees 

gpio.setmode(gpio.BCM)   # tells RPi.GPIO we want to use pin names (BCM is the mfg) 
for pin in PINSh:   # pin is a variable name assigned a new value each loop; PINS is a list 
    gpio.setup(pin, gpio.OUT)  # this says we want to use 'pin' as an output 

for pin in PINSv:   # pin is a variable name assigned a new value each loop; PINS is a list 
    gpio.setup(pin, gpio.OUT) 

def stepper(sequence, pins):  # def says 'stepper' is the function name (like a variable), then parameters are inside() 
    for step in sequence: 
     for pin in pins: 
      if pin in step: 
       gpio.output(pin, gpio.HIGH) 
      else: 
       gpio.output(pin, gpio.LOW) 

webcam_horz_home = open("horz.txt", "a") 
webcam_horz_home.close()     
webcam_vert_home = open("vert.txt", "a") 
webcam_vert_home.close() 

# load last position prior to power down 

webcam_horz_home = open("horz.txt", "r") 
rows = webcam_horz_home.readlines(); 
for row in rows: 
    adjusth = int(row) 
webcam_horz_home.close() 

webcam_vert_home = open("vert.txt", "r") 
rows = webcam_vert_home.readlines(); 
for row in rows: 
    adjustv = int(row) 
webcam_vert_home.close()     
counter = 0    # move to home position 
while counter < adjustv:        
    stepper(SEQAv, PINSv)        
    counter = counter + 1 
# CONTINUAL PAN AND TILT OPERATION (box pattern): 
+0

Моя линия crontab -e - @reboot (sleep2; python/home/pi/mystepper6.py) & – Mark

+0

Что делать, если вы попробуете 'sudo chmod + x your_script' и добавьте скрипт в crontab root через' sudo crontab -e'? Выпишите все пути от root до файла в crontab. Также могут возникать проблемы с директивой '@ reboot' (я прочитал довольно много жалоб на эту особенную функцию cron) – jDo

+0

jDo, просто попробовал свое предложение следующим образом: @reboot (sleep2; sudo chmod + x python/home/pi/mystepper6.py) и от sudo crontab -e и получили ту же проблему. Правильно ли я ввел ваше предложение? – Mark

ответ

1

Я только что испытал это на своем Pi, работающем на Raspbian, и это сработало.

Во-первых, я создал скрипт python под названием some_script.py в домашнем каталоге основного пользователя. содержание сценария:

import sys 
import time 

with open("/home/username/some_script.py.out", "w") as f: 
    f.write(str(time.time()) + " " + "some_script.py RAN!\n") 

Затем в терминале, я поставил исполняемый бит на файл, который позволяет ему быть выполнены:

sudo chmod +x some_script.py 

Затем, также в терминале, я набрал sudo crontab -e и добавил следующая строка в нижней части кронтаб в root пользователя:

@reboot sleep 2; /usr/bin/python /home/username/some_script.py 

Я тогда перезагружается, cd Эда /home/username/ и подтвердил, что питон был работать при перезагрузке и записывается в файл:

cat some_script.py.out 
1458062009.53 some_script.py RAN! 

UPDATE/РЕШЕНИЕ

После подтверждения того, что ОП удалось успешно повторить описанные выше действия, я был достаточно уверен, что это не было проблемой, связанной с различными реализациями cron на разных системах * nix или в каком-либо другом случае. Как и ожидалось, он мог запускать python через cron, он мог использовать функцию @reboot, и он мог писать на диск без каких-либо проблем с разрешением.

Однако все еще не работает. Что сделал Решить проблему было просто использовать абсолютные пути, а не относительные пути.

Изменение

webcam_horz_home = open("horz.txt", "a") 

к

webcam_horz_home = open("/home/pi/horz.txt", "a") 

и

webcam_vert_home = open("vert.txt", "a") 

к

webcam_vert_home = open("/home/pi/vert.txt", "a") 

получил степперы Op снова мурлычет :)

ОБЪЯСНЕНИЕ/ФОН

При выполнении сценариев или команд через кронтаб других пользователей (в данном случае root), пути относительно домашней директории обычного пользователя (например. ~/.bashrc) больше не будет действительным или укажет на другой файл с тем же именем файла, если он существует. Такая же проблема возникает, когда люди запускают серверы, которые вызывают языки сценариев, такие как PHP (часто исполняемый пользователем www-data).

На малине Pi эти вещи могут вызвать уловку-22 при работе с GPIO, поскольку устройство GPIO заблокировано и недоступно для непривилегированных пользователей без изменения разрешений и групп.

Если OP пробежался сценарий как root путем добавления записи хрон через sudo crontab -e, он будет иметь доступ к устройству GPIO (с root имеет доступ почти ко всему). Однако относительные пути в его скрипте python, которые неявно ссылаются на домашнюю папку непривилегированного пользователя pi, больше не будут действительны (поскольку home теперь означает папку /root, которая является домашней папкой пользователя root).

Если OP пробежал сценарии через кронтаб непривилегированной pi пользователя путем добавления записей хрон через crontab -e (без sudo), пути будут действительны (home или ~/ теперь будет означать /home/pi/), но тогда он не будет иметь доступ к устройству GPIO с pi довольно непривилегирован. Примечание: функция @reboot недоступна во всех реализациях cron (некоторые встроенные и разделенные вниз дистрибутивы nix не имеют ее), и часто она не работает для пользователей, отличных от root.

Это означает, что OP было два варианта (там может быть больше, я не гуру Linux):

  1. место файлы vert.txt и horz.txt в домашней папке пользователя root.
  2. просто измените пути, указанные в скрипте python, и продолжайте запускать скрипт @reboot в crontab root.

No. 2, вероятно, лучше, так как он держит домашнюю папку root пустой и сохраняет файлы OP в домашней папке pi «s. root, как правило, не следует смешивать, если нет других параметров, таких как использование sudo.

+0

jDo, я благодарю вас за ваши усилия, но я все еще не могу его запустить. У меня был очень похожий сценарий, который выполнялся; Я использовал фотодатчики, чтобы найти дом для веб-камеры на этом. Я модифицировал этот скрипт для записи положения шагового двигателя, он работает вручную, но не может заставить его работать от crontab. Я сделал все, что знаю, чтобы выяснить, почему он висит, но я явно застрял. Я перепечатывал весь код как минимум дважды без улучшения и повторно пробовал старый код, и он работает. – Mark

+0

Попробуйте выполнить то, что я сделал, и посмотреть, создает ли файл '/ home/username/some_script.py.out'. Создайте тот же скрипт, сделайте его исполняемым с помощью chmod, добавьте в crontab и т. Д. – jDo

+0

Хорошо, я попробую. Если мне это потребуется, у меня будет встреча примерно за 15 минут, что может занять у меня 45 минут. – Mark

 Смежные вопросы

  • Нет связанных вопросов^_^