crontab с помощью скрипта sudo python

Хорошо, я кое-что нашла. Не знаю, как с этим справиться. Я видел, что это обычная ошибка, возникающая в Google. Ошибка, похоже, связана с переменными среды или чем-то еще. Не знаю, как с этим справиться:

Это код, и это та часть, где вызывается подпроцесс, который приводит к ошибке:

#!/usr/bin/python

import subprocess
import re
import sys
import time
import datetime
import gspread

# ===========================================================================
# Google Account Details
# ===========================================================================

# Account details for google docs
email       = '[email protected]'
password    = 'my_password'
spreadsheet = 'my_spreadsheet'

# ===========================================================================
# Example Code
# ===========================================================================


# Login with your Google account
try:
  gc = gspread.login(email, password)
except:
  print "Unable to log in.  Check your email address/password"
  sys.exit()

# Open a worksheet from your spreadsheet using the filename
try:
  worksheet = gc.open(spreadsheet).sheet1
  # Alternatively, open a spreadsheet using the spreadsheet's key
  # worksheet = gc.open_by_key('0BmgG6nO_6dprdS1MN3d3MkdPa142WFRrdnRRUWl1UFE')
except:
  print "Unable to open the spreadsheet.  Check your filename: %s" % spreadsheet
  sys.exit()

# Continuously append data
while(True):
  # Run the DHT program to get the humidity and temperature readings!

  output = subprocess.check_output(["./Adafruit_DHT", "2302", "17"]);
  print output
  matches = re.search("Temp =\s+([0-9.]+)", output)
  if (not matches):
        time.sleep(3)
        continue
  temp1 = float(matches.group(1))
  temp = temp1*9/5+32 # added the extra step to converto to fahrenheit

  # search for humidity printout
  matches = re.search("Hum =\s+([0-9.]+)", output)
  if (not matches):
       time.sleep(3)
       continue
  humidity = float(matches.group(1))

  print "Temperature: %.1f F" % temp
  print "Humidity:    %.1f %%" % humidity

  # Append the data in the spreadsheet, including a timestamp
  try:
    values = [datetime.datetime.now(), temp, humidity]
    worksheet.append_row(values)
  except:
    print "Unable to append data.  Check your connection?"
    sys.exit()

  # Wait 30 seconds before continuing or just exit
  print "Wrote a row to %s" % spreadsheet
#  time.sleep(60)
  sys.exit()

вот в основном это. Он отлично работает с sudo python script.py, пока программа Adafruit_DHT находится в том же каталоге.

Вот ошибка, которую я получаю:

Traceback (most recent call last):
  File "/home/pi/Adafruit/dht/Ada_temp.py", line 44, in <module>
    output = subprocess.check_output(["./home/pi/Adafruit/dht/Adafruit_DHT", "2302", "17"]);
  File "/usr/lib/python2.7/subprocess.py", line 537, in check_output
    process = Popen(stdout=PIPE, *popenargs, **kwargs)
  File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1259, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

Я попытался добавить полный путь к программе c (Adafruit_DHT), но безрезультатно ...


person rickman90    schedule 27.07.2013    source источник
comment
Вы должны увидеть ошибки в /var/log/syslog. Есть ли?   -  person twil    schedule 27.07.2013
comment
Ваш скрипт вообще не запускается или работает, но не записывает в электронную таблицу Google?   -  person Verma    schedule 27.07.2013
comment
От имени какого пользователя работает cron? Это в sudoers? Не могли бы вы обернуть скрипт Python в скрипт bash, который вызывает sudo?   -  person Adam Benzan    schedule 27.07.2013
comment
В системном журнале мало, то же сообщение, что и у другого работающего cron. Скрипт отлично работает при вводе с помощью sudo (cron запускается от имени пользователя root). Мне нужно будет изучить сценарий bash ...   -  person rickman90    schedule 27.07.2013
comment
crontab имеет собственное окружение. Попробуйте указать абсолютный путь к python. Также не вызывайте sudo в crontab. Если вы должны запустить его как root, обычно вызывайте скрипт из sudo crontab   -  person inspectorG4dget    schedule 27.07.2013
comment
как насчет разрешений файла? chmod 777?   -  person Udy    schedule 27.07.2013
comment
да, я пытаюсь избежать старого доброго chmod 777 ...   -  person rickman90    schedule 27.07.2013
comment
хотя, может быть, 777 временно просто для проверки ...   -  person rickman90    schedule 27.07.2013
comment
нет, подождите, я думал, что для доступа к gpio требуется sudo, поэтому я не думаю, что chmod 777ing script поможет в любом случае ...   -  person rickman90    schedule 27.07.2013


Ответы (2)


Найдите проблему.

  1. Скрипт вообще запускается? Сделайте что-нибудь тривиальное в первой строке скрипта, чтобы убедиться, что он действительно запускается из cron (например: запись в файл в / tmp).

  2. Как только вам удалось запустить его, поищите другие проблемы. Cron может быть настроен на отправку письма с выводом скрипта. Я вижу одну очевидную вещь: ./Adafruit_DHT, используется относительный путь, это плохой знак, сценарий cron, вероятно, не выполняется в каталоге, который, по вашему мнению, выполняется. Исправить (= использовать абсолютный путь).

person Karoly Horvath    schedule 27.07.2013
comment
ну, скрипт прекрасно работает, когда я набираю sudo python script.py в командной строке (я ssh'd в). Он выводит результат на экран, я могу наблюдать, как электронная таблица Google создает новую строку, бац! данные там. Я просто не могу заставить его работать в crontab, и теперь у меня есть отдельный сценарий bash, вызываемый из /etc/init.d, и он тоже не работает. забавная вещь, однако, используя /etc/init.d/script start, он запускает скрипт python, но не в фоновом режиме. Я использовал пример сценария noip2 init.d, адаптированный к моему сценарию python. - person rickman90; 27.07.2013
comment
У меня он запускался из моего каталога / home / pi и из каталога / usr / local / bin (с программой Adafruit_DHT c там же). Кажется, он запускается только в том случае, если я вручную набираю команду. Просто отказывается делать это в фоновом режиме через crontab или /etc/init.d ... :( - person rickman90; 27.07.2013
comment
Не знаю, что сказать. Похоже, вы либо не прочитали мой ответ, либо просто проигнорировали его. - person Karoly Horvath; 27.07.2013
comment
Хорошо, поэтому, отвечая на первую часть вашего ответа 1 с помощью сценария, я решил, что этого было достаточно. Но если взглянуть на это еще раз, может быть, вы это понимаете, но означает ли это, что он запускается при активации в crontab? хммм ... ну, я посмотрел в / var / log / syslog и увидел, что экземпляр создается с некоторой информацией, которая почти такая же, как и другой скрипт, который я запустил (успешно, но без sudo) в crontab . Просто ничего не генерируется. Думаю, мне придется повторно проанализировать ваши шаги 1 и 2 и попытаться понять, что вы имеете в виду и как это сделать. - person rickman90; 27.07.2013

Пытаться:

output = subprocess.check_output(["PATH_TO_Adafruit_DHT/Adafruit_DHT", "2302", "17"]);

О, и измените свою строку cron на: / usr / bin / python /home/pi/myscript.py

person Bartosz Meister    schedule 28.07.2013
comment
Если в сценарии есть правильная строка #!, нет необходимости явно вызывать ее через /usr/bin/python. - person Keith Thompson; 29.07.2013
comment
Из того, что я испытал в прошлом, это не всегда работает с #!. Береженого Бог бережет. - person Bartosz Meister; 29.07.2013