Python: циклы подпроцесса навсегда - PullRequest
0 голосов
/ 29 января 2010

Я пытаюсь запустить / остановить 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)

Ответы [ 2 ]

1 голос
/ 29 января 2010

Не уверен, что происходит, но попробуйте создать свой скрипт оболочки следующим образом:

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

Еще одна вещь, которую стоит попробовать:

В самом начале скрипта выведите аргументы - вы можете обнаружить, что он зацикливается, если не может получить правильные параметры или что-то в этом роде.

0 голосов
/ 29 января 2010

Вы уверены, что скрипт не зацикливается сам? Код Python выглядит так, будто он просто ожидает завершения подпроцесса.

Получите PID скрипта Python, затем выполните:

watch pstree -ap <PID>

Посмотрите, совпадает ли PID сценария запуска / остановки - возможно, код python зацикливается по какой-то причине.

Если PID сценария init.d является постоянным, то выполните strace или truss для этого PID, чтобы увидеть, что он делает.

...