Restores SIGPIPE on script processes

There is an issue https://bugs.python.org/issue1652
in Python 2.7 which was resolved in Py3.

By default Python sets SIGPIPE to SIG_IGN on startup, because
it prefers to check every write and raise an IOError exception rather
than taking SIGPIPE. This is all well and good for Python itself.
However, non-Python Unix subprocesses generally expect to have
SIGPIPE set to the default action, since that's what will happen if
they're started from a normal shell.

As a result scripts with piping that is terminated in reverse chain
order are never exit.

See more info here:
http://www.enricozini.org/blog/2009/debian/python-pipes/

Closes-Bug: #1524347
Change-Id: Ia015e7fd46912f6a0be97a6b9c297f8d14fd3f7c
This commit is contained in:
Stan Lagun 2016-03-22 16:47:49 +03:00
parent a333528676
commit 8738324d9c
1 changed files with 13 additions and 7 deletions

View File

@ -14,6 +14,7 @@
# limitations under the License.
import os
import signal
import stat
import subprocess
import sys
@ -52,13 +53,18 @@ class ApplicationExecutor(object):
script_name = os.path.relpath(self._path)
LOG.debug("Starting '{0}' script execution".format(script_name))
process = subprocess.Popen(
app,
stdout=stdout,
stderr=stderr,
universal_newlines=True,
cwd=dir_name,
shell=True)
popen_kwargs = {
'stdout': stdout,
'stderr': stderr,
'universal_newlines': True,
'cwd': dir_name,
'shell': True
}
if os.name != 'nt':
popen_kwargs['preexec_fn'] = lambda: signal.signal(
signal.SIGPIPE, signal.SIG_DFL)
process = subprocess.Popen(app, **popen_kwargs)
stdout, stderr = process.communicate(input)
retcode = process.poll()
LOG.debug("Script {0} execution finished "