|
1 | 1 | import logging |
2 | 2 | import random |
3 | 3 | import signal |
| 4 | +import sys |
4 | 5 | import time |
5 | 6 | from argparse import ArgumentParser, ArgumentTypeError |
6 | 7 | from types import FrameType |
@@ -33,16 +34,22 @@ def __init__( |
33 | 34 | self.running_task = False |
34 | 35 |
|
35 | 36 | def shutdown(self, signum: int, frame: Optional[FrameType]) -> None: |
| 37 | + if not self.running: |
| 38 | + logger.warning( |
| 39 | + "Received %s - shutting down immediately.", signal.strsignal(signum) |
| 40 | + ) |
| 41 | + sys.exit(1) |
| 42 | + |
36 | 43 | logger.warning( |
37 | | - "Received %s - shutting down gracefully.", signal.strsignal(signum) |
| 44 | + "Received %s - shutting down gracefully... (press Ctrl+C again to force)", |
| 45 | + signal.strsignal(signum), |
38 | 46 | ) |
39 | | - |
40 | 47 | self.running = False |
41 | 48 |
|
42 | 49 | if not self.running_task: |
43 | 50 | # If we're not currently running a task, exit immediately. |
44 | 51 | # This is useful if we're currently in a `sleep`. |
45 | | - exit(0) |
| 52 | + sys.exit(0) |
46 | 53 |
|
47 | 54 | def configure_signals(self) -> None: |
48 | 55 | signal.signal(signal.SIGINT, self.shutdown) |
@@ -94,8 +101,11 @@ def start(self) -> None: |
94 | 101 | # If we're running in "batch" mode, terminate the loop (and thus the worker) |
95 | 102 | return None |
96 | 103 |
|
97 | | - # Wait before checking for another task |
98 | | - time.sleep(self.interval) |
| 104 | + # If ctrl-c has just interrupted a task, self.running was cleared, |
| 105 | + # and we should not sleep, but rather exit immediately. |
| 106 | + if self.running: |
| 107 | + # Wait before checking for another task |
| 108 | + time.sleep(self.interval) |
99 | 109 |
|
100 | 110 | def run_task(self, db_task_result: DBTaskResult) -> None: |
101 | 111 | """ |
|
0 commit comments