python - cron 运行脚本时,subprocess.call 总是返回错误
问题描述
我有一个简单的 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 shell 并手动运行重要的命令,它似乎工作正常:
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 具有相同的结果。
我在哪里错了?
解决方案
使用绝对路径,而不仅仅是dhcpd
脚本中的命令名称。
尝试设置空后调用脚本是否仍然有效PATH
。
推荐阅读
- karate - 在空手道中,创建的 surefire XML 报告在执行的下一个测试中一个接一个地为所有示例附加和合并测试步骤
- javascript - 如何更改 HTML 标签跨度中的文本?
- javascript - 在 mongoDB 中搜索集合时如何接受空数据
- identityserver4 - 声明未添加到 Identity Server 4 中的令牌
- javascript - jQuery .click() 用于附加元素
- kotlin - 如何通过 JNI 实现 Kotlin 属性?
- reactjs - 为什么当底层组件重新渲染时popper会跳到左上角?
- ruby-on-rails - 没有路由匹配 {:action=>"show", :controller=>"categories", :url=>""},缺少必需的键:[:url]
- python - 有没有办法优化 SpaCy 培训?
- python - 调用 __missing__ 后,作为字典值的列表变为无