You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by bo...@apache.org on 2017/10/21 08:24:58 UTC

incubator-airflow git commit: [AIRFLOW-1745] Restore default signal disposition

Repository: incubator-airflow
Updated Branches:
  refs/heads/master 3d4feb609 -> ca961042c


[AIRFLOW-1745] Restore default signal disposition

Restore defaults for SIGPIPE, SIGXFZ, and SIGXFSZ
Python 2.7 subprocess resets signal disposition
for these
signals to ignore, which can cause problems.  For
example,
a simple BashOperator executing 'yes | head' may
never
terminate.  For details, see discussion at:
https://bugs.python.org/issue1652
https://stackoverflow.com/questions/22077881/yes-
reporting-error-with-subprocess-communicate
etc.

Closes #2714 from wrp/sigpipe


Project: http://git-wip-us.apache.org/repos/asf/incubator-airflow/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-airflow/commit/ca961042
Tree: http://git-wip-us.apache.org/repos/asf/incubator-airflow/tree/ca961042
Diff: http://git-wip-us.apache.org/repos/asf/incubator-airflow/diff/ca961042

Branch: refs/heads/master
Commit: ca961042c146d49504e00e4abefc7779f0747782
Parents: 3d4feb6
Author: William Pursell <wi...@wepay.com>
Authored: Sat Oct 21 10:24:52 2017 +0200
Committer: Bolke de Bruin <bo...@xs4all.nl>
Committed: Sat Oct 21 10:24:52 2017 +0200

----------------------------------------------------------------------
 airflow/operators/bash_operator.py | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-airflow/blob/ca961042/airflow/operators/bash_operator.py
----------------------------------------------------------------------
diff --git a/airflow/operators/bash_operator.py b/airflow/operators/bash_operator.py
index ff2ed51..a7eeb03 100644
--- a/airflow/operators/bash_operator.py
+++ b/airflow/operators/bash_operator.py
@@ -79,12 +79,18 @@ class BashOperator(BaseOperator):
                     "Temporary script location: %s",
                     script_location
                 )
+                def pre_exec():
+                    # Restore default signal disposition and invoke setsid
+                    for sig in ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ'):
+                        if hasattr(signal, sig):
+                            signal.signal(getattr(signal, sig), signal.SIG_DFL)
+                    os.setsid()
                 self.log.info("Running command: %s", bash_command)
                 sp = Popen(
                     ['bash', fname],
                     stdout=PIPE, stderr=STDOUT,
                     cwd=tmp_dir, env=self.env,
-                    preexec_fn=os.setsid)
+                    preexec_fn=pre_exec)
 
                 self.sp = sp