Сценарий Python, вызывающий `arp`, выдает ошибку при запуске из crontab

Мой сервер:

Linux dhcpns 3.19.0-28-generic #30-Ubuntu SMP Mon Aug 31 15:52:51 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

Мой скрипт на Python:

#! /usr/bin/python

import syslog, traceback
import subprocess as sp

def getarp():
  cmd = ["arp", "-a"]
  arp = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE)
  output, err = arp.communicate()
  entries = output.splitlines()
  return entries

def syslog_trace(trace):
  log_lines = trace.split('\n')
  for line in log_lines:
    if len(line):
      syslog.syslog(syslog.LOG_ALERT,line)

if __name__ == '__main__':
  try:
    lstArp =  getarp()
    print lstArp
  except Exception as e:
    syslog.syslog(syslog.LOG_ALERT,e.__doc__)
    syslog_trace(traceback.format_exc())
    raise

Когда я запускаю скрипт из командной строки, он выдает ожидаемый результат. Тем не менее, когда я вызываю сценарий из crontab -e (перенаправление вывода в файл, очевидно) скрипт завершается неудачно.

Журнал:

Sep 28 18:36:01 dhcpns testarp.py[9984]: OS system call failed.
Sep 28 18:36:01 dhcpns testarp.py[9984]: Traceback (most recent call last):
Sep 28 18:36:01 dhcpns testarp.py[9984]: File "/home/ubuntu/testarp.py", line 23, in <module>
Sep 28 18:36:01 dhcpns testarp.py[9984]: lstArp =  getarp()
Sep 28 18:36:01 dhcpns testarp.py[9984]: File "/home/ubuntu/testarp.py", line 10, in getarp
Sep 28 18:36:01 dhcpns testarp.py[9984]: arp = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE)
Sep 28 18:36:01 dhcpns testarp.py[9984]: File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
Sep 28 18:36:01 dhcpns testarp.py[9984]: errread, errwrite)
Sep 28 18:36:01 dhcpns testarp.py[9984]: File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child
Sep 28 18:36:01 dhcpns testarp.py[9984]: raise child_exception
Sep 28 18:36:01 dhcpns testarp.py[9984]: OSError: [Errno 2] No such file or directory

WTF? Что мне не хватает?

1 ответ

Решение

Команды, которые запускаются через cron, наследуют другую среду. Особенно, PATH envvar может быть другим. Чтобы обойти это, укажите полный путь к arp запрограммируйте в своем скрипте Python или настройте PATH в соответствующем crontab явно:

PATH=/bin:/usr/bin:/path/where/arp/lives
Другие вопросы по тегам