Уведомления

Группа в Telegram: @pythonsu

#1 Март 14, 2011 17:20:34

dll090
От:
Зарегистрирован: 2011-01-22
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

shell и subrocess.Popen (в чём разница)

Здравствуйте,

Есть shell скрипт в котором перезагружаются/останавливаются/запускаются службы FreeBSD


так вот если запускать этот скрипт просто из консоли, - он отрабатывает нормально (за секунды три)
но если сделать тот же запуск из питона:

subprocess.Popen(['script.sh'], shell=True)
скрипт подвисается в ожидании завершения службы mpd5; ответа я от него не дождался

Вопрос не конкретно по данной службе а в целом, в чём разница то?
Переменные окружения, ещё что то?
Какие есть варианты как можно это обойти?
Предположения?

Был похожий топик, но там нет ответа

P.S.: скрипт запускается из по рута.



Отредактировано (Март 14, 2011 17:21:23)

Офлайн

#2 Март 14, 2011 18:57:52

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

shell и subrocess.Popen (в чём разница)

proc = subprocess.Popen(['script.sh'], shell=True, executable='/bin/bash')
proc.wait()
Не так?



Офлайн

#3 Март 14, 2011 21:31:32

dll090
От:
Зарегистрирован: 2011-01-22
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

shell и subrocess.Popen (в чём разница)

Хм, а разве при использовании параметра shell = True питон не станет запускать это в шелле по умолчанию (для FreeBSD это /bin/sh) и нужно явное указание?

Не на чем сейчас проверить, завтра на работе проверю, - отпишусь



Отредактировано (Март 14, 2011 21:31:57)

Офлайн

#4 Март 15, 2011 04:16:48

dll090
От:
Зарегистрирован: 2011-01-22
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

shell и subrocess.Popen (в чём разница)

Ничего не изменилось, эффект тот же.

Added:

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

А если сделать так:
Cервер пишет в файл команду.
Другой демон, раз в 1 сек проверяет если там что то. И если есть - то выполняет и очищает файл.
- Так работает нормально, но это какое то костыльное решение.

Буду думать дальше..



Отредактировано (Март 15, 2011 04:58:46)

Офлайн

#5 Март 15, 2011 09:03:36

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

shell и subrocess.Popen (в чём разница)

на крайний случай можно os.system() попробовать

Офлайн

#6 Март 15, 2011 10:04:38

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

shell и subrocess.Popen (в чём разница)

Может так правильнее?

import subprocess

process = subprocess.Popen(['script.sh'], shell = True, stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
process.stdout.read()
А вообще, учимся читать первоисточник:
# Python 2.6.6
# subprocess.py:1030
# ...
if shell:
args = ["/bin/sh", "-c"] + args
if executable:
args[0] = executable
# ...
..bw



Офлайн

#7 Март 15, 2011 11:44:42

dll090
От:
Зарегистрирован: 2011-01-22
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

shell и subrocess.Popen (в чём разница)

o7412369815963

Пробовал, без разницы в принципе.


bw

А почему в данном случае так должно быть правильнее?
Это же зависит от задачи куда мне нужно перенаправлять потоки, и нужно ли видеть stderr.
А вообще я собирал и strdout и stderr, в том то и дело что ошибок нет видимых, на определённом шаге команда просто подвисает. В логе демона (mpd5, - который останавливается, - тоже нет ошибок)

PS: А насчёт того что бы читать первоисточник, согласен конечно, надо посмотреть что там как



Офлайн

#8 Март 15, 2011 12:02:39

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

shell и subrocess.Popen (в чём разница)

а если попробовать в Popen подставить окружение которое пришло из вне?: env = os.environ

Офлайн

#9 Март 15, 2011 15:17:17

dll090
От:
Зарегистрирован: 2011-01-22
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

shell и subrocess.Popen (в чём разница)

И так тоже не помогает. И что характерно что проблема только с остановкой служб. С запуском проблем нет.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version