Merge "Restore SIGPIPE default action for subprocesses" into stable/folsom

This commit is contained in:
Jenkins 2012-10-13 23:21:51 +00:00 committed by Gerrit Code Review
commit 4946d4bb28
3 changed files with 24 additions and 0 deletions

View File

@ -38,6 +38,7 @@
import ConfigParser import ConfigParser
import os import os
import signal
import subprocess import subprocess
import sys import sys
@ -47,6 +48,12 @@ RC_NOCOMMAND = 98
RC_BADCONFIG = 97 RC_BADCONFIG = 97
def _subprocess_setup():
# Python installs a SIGPIPE handler by default. This is usually not what
# non-Python subprocesses expect.
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
if __name__ == '__main__': if __name__ == '__main__':
# Split arguments, require at least a command # Split arguments, require at least a command
execname = sys.argv.pop(0) execname = sys.argv.pop(0)
@ -84,6 +91,7 @@ if __name__ == '__main__':
stdin=sys.stdin, stdin=sys.stdin,
stdout=sys.stdout, stdout=sys.stdout,
stderr=sys.stderr, stderr=sys.stderr,
preexec_fn=_subprocess_setup,
env=filtermatch.get_environment(userargs)) env=filtermatch.get_environment(userargs))
obj.wait() obj.wait()
sys.exit(obj.returncode) sys.exit(obj.returncode)

View File

@ -21,6 +21,7 @@ import fcntl
import logging import logging
import os import os
import shlex import shlex
import signal
import socket import socket
import struct import struct
@ -30,6 +31,12 @@ from eventlet.green import subprocess
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
def _subprocess_setup():
# Python installs a SIGPIPE handler by default. This is usually not what
# non-Python subprocesses expect.
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
def execute(cmd, root_helper=None, process_input=None, addl_env=None, def execute(cmd, root_helper=None, process_input=None, addl_env=None,
check_exit_code=True, return_stderr=False): check_exit_code=True, return_stderr=False):
if root_helper: if root_helper:
@ -42,6 +49,7 @@ def execute(cmd, root_helper=None, process_input=None, addl_env=None,
env.update(addl_env) env.update(addl_env)
obj = subprocess.Popen(cmd, shell=False, stdin=subprocess.PIPE, obj = subprocess.Popen(cmd, shell=False, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
preexec_fn=_subprocess_setup,
env=env) env=env)
_stdout, _stderr = (process_input and _stdout, _stderr = (process_input and

View File

@ -23,6 +23,7 @@
import logging import logging
import os import os
import signal
import subprocess import subprocess
import uuid import uuid
@ -47,6 +48,12 @@ def boolize(subject):
return subject return subject
def _subprocess_setup():
# Python installs a SIGPIPE handler by default. This is usually not what
# non-Python subprocesses expect.
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
def execute(cmd, process_input=None, addl_env=None, check_exit_code=True): def execute(cmd, process_input=None, addl_env=None, check_exit_code=True):
logging.debug("Running cmd: %s", cmd) logging.debug("Running cmd: %s", cmd)
env = os.environ.copy() env = os.environ.copy()
@ -54,6 +61,7 @@ def execute(cmd, process_input=None, addl_env=None, check_exit_code=True):
env.update(addl_env) env.update(addl_env)
obj = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, obj = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
preexec_fn=_subprocess_setup,
env=env) env=env)
result = None result = None
if process_input is not None: if process_input is not None: