【问题标题】:Python: subprocess loops foreverPython:子进程永远循环
【发布时间】:2013-05-23 05:05:59
【问题描述】:

我正在尝试通过 python 脚本启动/停止rsyslog

RSYSLOG_INIT_SCRIPT='/etc/init.s/rsyslogd'
subprocess.call([RSYSLOG_INIT_SCRIPT,'stop'])

/etc/init.d/rsyslogd 是一个常规的初始化脚本。问题是它会一次又一次地继续执行这个脚本。 (我在脚本中添加了一个回显来确认这一点)。

这是我杀死它时的堆栈跟踪:

  File "queuerunner.py", line 72, in <module>
    rsysloglauncher.startrsyslog()
  File "/root/logging-server/Logging-server-init/src/initializer/rsyslog/rsysloglauncher.py", line 23, in startrsyslog
    subprocess.call([RSYSLOG_INIT_SCRIPT,"stop"])
  File "/storage/local/python-2.6.4/lib/python2.6/subprocess.py", line 470, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/storage/local/python-2.6.4/lib/python2.6/subprocess.py", line 1157, in wait
    pid, sts = os.waitpid(self.pid, 0)

【问题讨论】:

    标签: python subprocess rsyslog


    【解决方案1】:

    不确定发生了什么,但尝试像这样创建您的 shell 脚本:

    #!/bin/sh
    while :
    do
        echo "Sleeping..."
        sleep 1
    done
    

    然后确认你的 python 程序在运行这个脚本时做同样的事情。

    然后用这个脚本确认python调用:

    #!/bin/sh
    echo "I will exit"
    

    看看您是否可以从原始脚本中获得更多输出,创建一个“代理”脚本 - 您将从 Python 脚本中调用它。

    #!/bin/sh
    /etc/init.s/rsyslogd stop > /tmp/log 2>&1
    

    并编辑您的原始脚本以产生更多输出:

    #!/bin/sh -xv
    

    我假设它是 bourne-shell 或 bash。

    然后调用这个脚本 : 然后用 : 检查 /tmp/log

    tail -f /tmp/log
    

    另外,你能得到:

    subprocess.call(...
    

    要返回创建的进程的 PID 吗?如果是这样,请使用以下方式对其进行跟踪:

    ps -eaf |grep <PID>
    

    当然应该用实际的PID代替哪里。

    根据操作系统,您还可以:

    truss -o /tmp/truss.out <PID>
    

    如果这个“truss.out”继续被系统调用填满,那么你就知道你的 shell 脚本正在循环——然后命令行调用和 python 调用之间有些不同(我还不确定)。

    我同意另一张海报:看起来脚本在循环 - 而不是严格意义上的 python 脚本问题。

    要尝试的另一件事:

    在脚本的开头,回显参数 - 如果它无法获取正确的参数或其他内容,您可能会发现它会循环。

    【讨论】:

      【解决方案2】:

      您确定脚本本身没有循环吗? python代码看起来只是在等待子进程退出。

      获取python脚本的PID,然后做:

      watch pstree -ap <PID>
      

      查看启动/停止脚本的 PID 是否相同 - 也许 Python 代码出于某种原因正在循环自身。

      如果 init.d 脚本 PID 是恒定的,则在该 PID 上执行 stracetruss 以查看它在做什么。

      【讨论】:

      • 确保脚本看到“停止”参数 - (我不知道为什么它不会) - 从脚本中回显调用参数 - 并从命令行调用一次,然后从python脚本。
      猜你喜欢
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      相关资源
      最近更新 更多