我有以下python测试脚本(从更大的.py文件中提取),试图在EC2实例(haproxy OpsWorks实例)上工作。

从 shell 程序作为cron条目运行与作为python脚本运行时所应用的权限之间似乎有很大的不同。

我在其他任何帖子中找到的最接近的是here,但这与shell脚本有关,并且鉴于我正在运行python OK,因此(我希望)路径应为cronjob进行充分配置。

环境:
-Python版本:2.6.8
-环境:EC2上的OpsWorks HAProxy实例。
-以root用户身份运行。

脚本

import subprocess
import boto
import logging

if __name__ == '__main__':
    logging.getLogger().setLevel(boto.logging.INFO)
    command = ['service', 'haproxy', 'reload'];
    logging.info('Executing: %s' % command)
    #shell=FALSE for sudo to work.
    subprocess.call(command, shell=False)

我也尝试使用以下命令调用subprocess命令,但无济于事。
# subprocess.call("%s %s %s %s" % ('sudo', 'service', 'haproxy', 'reload'))

从命令行运行时的输出:
[root@lb1 ~]# python tester.py
INFO:root:Executing: ['service', 'haproxy', 'reload']
Reloading haproxy:
[root@lb1 ~]#

Crontab条目:
[root@lb1 ~]# crontab -l
*/1 * * * * python ~/tester.py > ~/testlog 2>&1

作为crontab命令运行时的输出
[root@lb1 ~]# cat testlog
INFO:root:Executing: ['service', 'haproxy', 'reload']
Traceback (most recent call last):
  File "/root/tester.py", line 13, in <module>
    subprocess.call(command, shell=False)
  File "/usr/lib64/python2.6/subprocess.py", line 478, in call
    p = Popen(*popenargs, **kwargs)
  File "/usr/lib64/python2.6/subprocess.py", line 639, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.6/subprocess.py", line 1228, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

我很困惑为什么它会抛出“没有这样的文件或目录”错误!

谁能提供任何指针?顺便说一下,这是更大的EC2集成产品的一部分-因此boto导入[这是在这种情况下获取日志的好方法]。它以root身份运行,因为从浏览SO开始,对于使用sudo命令运行的用户帐户具有cron条目是一种不好的做法。

干杯,

最佳答案

在子过程中设置shell=True

subprocess.call(command, shell=True)

我认为您的问题将得到解决,但可能会出现sudo问题。

10-04 21:57
查看更多