Сообщение, которое вы видите, указывает на то, что ваш подпроцесс остановлен , а не на том, что произошла ошибка.Это происходит, например, при вводе Ctrl-Z
после запуска процесса в оболочке или, что эквивалентно, при отправке целевому процессу сигнала SIGTSTP
с помощью команды kill
.Предположительно, command
, к которому у вас нет доступа, получает этот сигнал.Он может даже отправлять его самому себе, хотя, не зная больше о команде, он просто размышляет о том, как или почему это происходит.
Вы можете игнорировать этот сигнал в Python, используямодуль signal
, в частности, функция pthread_sigmask()
.Один указывает маску сигналов и что с ними делать.В этом случае вы хотите игнорировать сигнал SIGTSTP
, что можно сделать с помощью: signal.pthread_sigmask(signal.SIG_BLOCK, (signal.SIGTSTP,))
.(Последний аргумент на самом деле представляет собой последовательность сигналов, которые нужно игнорировать.)
Запустив этот фрагмент кода, вы должны увидеть, что вы можете набрать Ctrl-Z
в терминале, а оболочка должна показать [1]+ Stopped ...
:
import time
duration = 5.0
print('Sleeping for {:0.2f} seconds'.format(duration))
time.sleep(duration)
Однако, используя следующий код, вы увидите, что сигнал игнорируется, и процесс продолжит "работать" (в данном случае в спящем режиме) независимо от сигнала.Вы должны просто видеть ^Z
в оболочке всякий раз, когда вы нажимаете Ctrl-Z
.
import time
import signal
duration = 5.0
print('Sleeping for {:0.2f} seconds, ignoring SIGTSTP'.format(duration))
signal.pthread_sigmask(signal.SIG_BLOCK, (signal.SIGTSTP,))
time.sleep(duration)
Чтобы фактически использовать это в вашем скрипте, игнорируйте сигнал, прежде чем вызывать соответствующий command
.Рекомендуется предварительно запросить маску сигналов процесса и сбросить ее до этого значения после того, как вы закончите с command
.Для получения дополнительной информации о сигналах и процессах вам следует просмотреть справочные страницы для signal(3)
, sigprocmask(2)
и kill(2)
.
Редактировать для Python <= 2.7 </strong>
signal.pthread_sigmask
был добавлен в Python 3.3.Решение, которое должно работать для более ранних версий, состоит в том, чтобы напрямую игнорировать сигнал, устанавливая обработчик, который делает именно это.Например:
import signal
import time
duration = 5.0
signal.signal(signal.SIGTSTP, signal.SIG_IGN)
print 'Sleeping for %f seconds, ignoring SIGTSTP' % duration
time.sleep(duration)
Как и в примере 3.3 выше, вы должны просто увидеть ^Z
, если вы нажмете Ctrl-Z
, указывая, что сигнал был проигнорирован.