Скрипт Python выполняется вручную, но не через cron

У меня установлен OpenELEC на двух малиновых писах. Я установил скрипт Python на одном из Pis, который открывает сетевой сокет и прослушивает соединение. Следующий код из сценария, который работает на другом Raspberry Pi и подключается к слушателю для отправки сообщения:

# Run the command on the local system to play the show
os.system(command)

# Set up network information for sending data and connect
r_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Open the client list file
clientlist = open("clients.txt", "r")

for line in clientlist.readlines():
 try:
 client = line.rstrip('\n').split(':')
 r_socket.connect((client[0], int(client[1])))
 except:
 print("Failed to connect to remote device")
 else:
 # Hash IP and MAC addresses
 hash = hashlib.sha224(r_socket.getsockname()[0] + " " + getHwAddr('eth0')).hexdigest()

 # Send the message to other RPis on the network
 r_socket.send(hash + "\n" + command)

# Close the socket when finished
r_socket.close()

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

Из того, что я понимаю, есть только одна учетная запись в Pi (root), и скрипт может выполняться всеми пользователями (chmod a + x myscript.py). Итак, я не думаю, что это проблема с разрешениями, но я не могу понять, в чем проблема.

Кто-нибудь знает, что может привести к сбою сетевой части сценария при выполнении cron, но не при запуске вручную?

1 ответ

Вы должны использовать абсолютные пути для clients.txt и command. Среда выполнения cron, скорее всего, не будет такой же, как ваша среда оболочки (разные переменные среды, другая рабочая директория).

licensed under cc by-sa 3.0 with attribution.