бегущая команда в фоновом режиме - PullRequest
3 голосов
/ 23 июня 2010

Я использую модуль подпроцесса python для запуска некоторой команды и сохранения ее результатов в фоновом режиме Команда развернута на моей машине. Теперь, когда я запускаю команду из командной строки, она работает нормально. Но когда я пытаюсь выполнить ту же команду с помощью модуля подпроцесса, она выдает следующую ошибку

Команда для выполнения: vxswadm listswitch all

process = subprocess.Popen('vxswadm listswitch all > tmp.txt &',shell=True)          
>>> Traceback (most recent call last):
    File "/usr/bin/vxswadm", line 30, in <module>
    l.uname = os.getlogin()
    OSError: [Errno 25] Inappropriate ioctl for device

Может кто-нибудь помочь мне исправить эту ошибку. Любые предложения будут полезны. Заранее спасибо

Tazim

Ответы [ 3 ]

2 голосов
/ 23 июня 2010

Вероятно, проблема связана с тем, что оболочка bash завершается сразу после & и отправляет сигнал SIGHUP во все его подпроцессы (стандартное поведение оболочки).

Вы можете использовать модуль подпроцесса для непосредственного выполнения команды и перенаправить вывод на tmp.txt самостоятельно, сначала открыв файл, а затем передав его дескриптор файла в аргумент stdout вызова Popen.

1 голос
/ 28 сентября 2015

Существует проблема с os.getlogin () и подпроцессингом и python.См. http://code.activestate.com/lists/python-list/288845/

Вам нужно использовать что-то еще, например:

pwd.getpwuid(os.getuid()).pw_name (только для Unix)

См. Также обсуждение по переносному способучтобы получить имя пользователя .

0 голосов
/ 23 июня 2010

Попробуйте изменить его на ['vxswadm', 'listswitch', 'all', '>', 'tmp.txt','&'] и / или изменить оболочку на False.

Я думаю, что это может быть бит оболочки, хотя (если это исправляет).

ВыМожно также попробовать добавить stdin=subprocess.PIPE, stdout=subprocess.PIPE, хотя я сомневаюсь, что это повлияет на это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...