summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Schubert <contact@benschubert.me>2019-11-08 14:27:57 +0000
committerBenjamin Schubert <contact@benschubert.me>2019-11-08 14:58:54 +0000
commit64c6f7daef8e6c9d9b883dfc0589001a4cb5df09 (patch)
tree1b909550cbd823f59119b295550ffca9f3e38ce2
parenteaf4c4895c5cb0f3e8fe68ca879f93caf1864695 (diff)
downloadbuildstream-64c6f7daef8e6c9d9b883dfc0589001a4cb5df09.tar.gz
job.py: handle SIGTERM gracefully
This allows showing a nice info to the user and stop showing that the return code was an unexpected 255.
-rw-r--r--src/buildstream/_scheduler/jobs/job.py14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/buildstream/_scheduler/jobs/job.py b/src/buildstream/_scheduler/jobs/job.py
index 51dfe4c25..975e45c2f 100644
--- a/src/buildstream/_scheduler/jobs/job.py
+++ b/src/buildstream/_scheduler/jobs/job.py
@@ -44,6 +44,7 @@ class _ReturnCode(FastEnum):
FAIL = 1
PERM_FAIL = 2
SKIPPED = 3
+ TERMINATED = 4
# JobStatus:
@@ -454,6 +455,13 @@ class Job():
status = JobStatus.SKIPPED
elif returncode in (_ReturnCode.FAIL, _ReturnCode.PERM_FAIL):
status = JobStatus.FAIL
+ elif returncode == _ReturnCode.TERMINATED:
+ if self._terminated:
+ self.message(MessageType.INFO, "Process terminated")
+ else:
+ self.message(MessageType.ERROR, "Process got terminated")
+
+ status = JobStatus.FAIL
else:
status = JobStatus.FAIL
@@ -713,6 +721,12 @@ class ChildJob():
with _signals.suspendable(stop_time, resume_time), \
self._messenger.recorded_messages(self._logfile, self._logdir) as filename:
+ # Graciously handle sigterms.
+ def handle_sigterm(_signum, _sigframe):
+ self._child_shutdown(_ReturnCode.TERMINATED)
+
+ signal.signal(signal.SIGTERM, handle_sigterm)
+
self.message(MessageType.START, self.action_name, logfile=filename)
try: