0

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

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)
4

2 回答 2

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 脚本问题。

另一件事要尝试:

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

于 2010-01-29T17:13:25.333 回答
0

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

获取python脚本的PID,然后执行:

watch pstree -ap <PID>

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

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

于 2010-01-29T17:10:14.900 回答