0

rsyslogPythonスクリプトを使用して開始/停止しようとしています:

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

何が起こっているのかわかりませんが、次のようなシェル スクリプトを作成してみてください。

#!/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

私はそれがボーンシェルまたはbashであると仮定しています。

次に、このスクリプトを呼び出します。次に、次のように /tmp/log を確認します。

tail -f /tmp/log

また、あなたは得ることができますか:

subprocess.call(...

作成されたプロセスの PID を返すには? その場合は、次のようなものを使用して追跡します。

ps -eaf |grep <PID>

もちろん、どこを実際のPIDに置き換える必要があります。

OS によっては、次のこともできる場合があります。

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

この 'truss.out' がシステム コールでいっぱいになる場合は、シェル スクリプトがループしていることがわかります。コマンドライン呼び出しと 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 に答える