diff options
author | Benjamin Schubert <contact@benschubert.me> | 2019-11-08 14:27:57 +0000 |
---|---|---|
committer | Benjamin Schubert <contact@benschubert.me> | 2019-11-08 14:58:54 +0000 |
commit | 64c6f7daef8e6c9d9b883dfc0589001a4cb5df09 (patch) | |
tree | 1b909550cbd823f59119b295550ffca9f3e38ce2 | |
parent | eaf4c4895c5cb0f3e8fe68ca879f93caf1864695 (diff) | |
download | buildstream-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.py | 14 |
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: |