首页 > 解决方案 > 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 具有相同的结果。

我在哪里错了?

标签: pythonsubprocess

解决方案


使用绝对路径,而不仅仅是dhcpd脚本中的命令名称。

尝试设置空后调用脚本是否仍然有效PATH


推荐阅读