У меня есть простой скрипт на 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 с теми же результатами.
Куда я здесь не так?