subprocess.call всегда возвращает ошибку, когда скрипт запускается cron - PullRequest
0 голосов
/ 14 июня 2019

У меня есть простой скрипт на python, который я использую для автоматизации обновлений файла конфигурации dhcp.

Идея состоит в том, что он помещает новый файл конфигурации в каталог dhcpd, выполняет проверку, и если он возвращает нормальноэто может перезапустить службу.Мой код выглядит следующим образом:


syslog.syslog(syslog.LOG_INFO, 'INFO: file copied to /etc/dhcp/conf.d')
return_code = subprocess.call(['dhcpd -t -cf /etc/dhcp/dhcpd.conf'], shell=True)
if return_code != 0:
    print('dhcp config test failed, exiting script')
    syslog.syslog(syslog.LOG_ERR, 'ERROR: dhcp config test failed, exiting script')
    sys.exit()
else:
    print('dhcp config test passed restarting service')
    syslog.syslog(syslog.LOG_INFO, 'INFO: config check passed, restarting service')
    return_code = subprocess.call(['service', conf['service_name'], 'restart'])
    if return_code != 0:
        print('dhcpd service failed to restart')
        syslog.syslog(syslog.LOG_ERR, 'ERROR: dhcpd service failed to restart')
    else:
        print('dhcpd service restarted')
        syslog.syslog(syslog.LOG_INFO, 'INFO: service restarted')
        email_results()

Этот скрипт запускается заданием cron, когда он запускается, он всегда терпит неудачу с этим битом:

print('dhcp config test failed, exiting script')

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

Если я открываю оболочку python и запускаю важные команды вручную, онКажется, работает нормально:

python3
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> return_code = subprocess.call(['dhcpd -t -cf /etc/dhcp/dhcpd.conf'], shell=True)
Internet Systems Consortium DHCP Server 4.3.3
Copyright 2004-2015 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Config file: /etc/dhcp/dhcpd.conf
Database file: /var/lib/dhcp/dhcpd.leases
PID file: /var/run/dhcpd.pid
>>> print(return_code)
0

Я пытался использовать "shell = True", а также пытался без.Я также пробовал subprocess.check_call с теми же результатами.

Куда я здесь не так?

Ответы [ 2 ]

1 голос
/ 14 июня 2019

Аргументы для subprocess должны быть либо массивом строк, либо одной строкой.Передача массива из одной строки является ошибкой, хотя она может работать на некоторых платформах, которые в любом случае существенно повреждены.

Вы хотите

return_code = subprocess.call(['dhcpd', '-t', '-cf', '/etc/dhcp/dhcpd.conf'])   # shell=False implicitly

или

return_code = subprocess.call('dhcpd -t -cf /etc/dhcp/dhcpd.conf', shell=True)

но на самом деле вам следует избегать shell=True, когда это возможно;см. также Фактическое значение 'shell = True' в подпроцессе

И, конечно, если dhcpd не находится в PATH, который вы получаете от cron, вы хотитеобновите PATH соответственно или используйте явный жестко заданный путь, например /usr/sbin/dhcpd (я обычно рекомендую первый).

1 голос
/ 14 июня 2019

Используйте абсолютные пути вместо просто имен команд, таких как dhcpd в вашем скрипте.

Попробуйте, если ваш скрипт все еще работает, когда вы вызываете его после установки пустого PATH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...