首页 文章

调用从Python脚本重新启动Linux中的“服务”,而不是在crontab条目中工作

提问于
浏览
1

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

在作为cron条目运行时应用的权限与从shell运行作为python脚本之间的权限之间似乎存在重大差异 .

我在其他任何帖子中找到的最接近的是here但是's relating to shell scripts and, given that I' m正在运行python OK,路径应该(我希望)为cronjob配置得足够多 .

环境: - Python版本:2.6.8 - 环境:OpsWorks HAProxy实例,在EC2上 . - 以用户身份运行: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条目是不好的做法 .

干杯,

2 回答

  • 0

    事实证明它确实与路径有关 .

    Path Information for Cronjobs
    Commands in submodules

    要解决这个问题,我通过 crontab -e 提供了以下条目

    [root@lb1 ~]# crontab -l
    SHELL=/bin/sh
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    

    现在我的服务按预期重新启动 . 好极了!

  • 0

    在子流程集 shell=True

    subprocess.call(command, shell=True)
    

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

相关问题