[New-bugs-announce] [issue38575] Child process deadlock in subprocess.Popen

Zhipeng Xie report at bugs.python.org
Thu Oct 24 03:38:39 EDT 2019


New submission from Zhipeng Xie <775350901 at qq.com>:

Hi, we had a child process deadlock on _disabling_gc_lock in subprocess.Popen. It seems that after https://github.com/python/cpython/commit/5e8e371364ee58dadb9a4e4e51c7e9cf6bedbfae, subprocess.Popen no longer support to be called in preexec_fn.

Steps to reproduce:
[root at localhost ~]# python2 --version
Python 2.7.15
[root at localhost ~]# python2 mtfork.py 

wait for a while and the child process deadlock

Here is the gdb stack:

(gdb) py-bt
Traceback (most recent call first):
  Waiting for the GIL
  File "/usr/local/lib/python2.7/subprocess.py", line 931, in _execute_child
    with self._disabling_gc_lock:
  File "/usr/local/lib/python2.7/subprocess.py", line 394, in __init__
    errread, errwrite)
  File "mtfork.py", line 36, in run_cmd
    stderr=subprocess.PIPE)
  File "/usr/local/lib/python2.7/subprocess.py", line 989, in _execute_child
    preexec_fn()
  File "/usr/local/lib/python2.7/subprocess.py", line 394, in __init__
    errread, errwrite)
  File "mtfork.py", line 15, in run_command
    stdout=arg_stdout, stderr=arg_stderr, shell=True)
  File "mtfork.py", line 51, in _readerthread3
    status = run_command("/root/exe",preexec_fn=preexec_fn_no_args)
  File "/usr/local/lib/python2.7/threading.py", line 754, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/local/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "/usr/local/lib/python2.7/threading.py", line 774, in __bootstrap
    self.__bootstrap_inner()
(gdb) py-list
 926                # The first char specifies the exception type: 0 means
 927                # OSError, 1 means some other error.
 928                errpipe_read, errpipe_write = self.pipe_cloexec()
 929                try:
 930                    try:
>931                        with self._disabling_gc_lock:
 932                            gc_was_enabled = gc.isenabled()
 933                            # Disable gc to avoid bug where gc -> file_dealloc ->
 934                            # write to stderr -> hang.
 935                            # https://bugs.python.org/issue1336
 936                            gc.disable()

----------
components: Library (Lib)
files: mtfork.py
messages: 355290
nosy: Zhipeng Xie
priority: normal
severity: normal
status: open
title: Child process deadlock in subprocess.Popen
type: behavior
versions: Python 2.7
Added file: https://bugs.python.org/file48675/mtfork.py

_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue38575>
_______________________________________


More information about the New-bugs-announce mailing list