initial 'signals-actions' implementation (#6582)

https://github.com/mikf/gallery-dl/issues/6582#issuecomment-2973285775

To stop gracefully after the current file finishes processing when
Ctrl+C was pressed, or after the current post finishes processing when
SIGUSR1 was received:

{
    "signals-actions": {
        "SIGINT" : "file",
        "SIGUSR1": "post"
    }
}
This commit is contained in:
Mike Fährmann
2025-07-09 22:22:32 +02:00
parent 4dfa8a75c0
commit 0210ffcdd8
3 changed files with 34 additions and 3 deletions

View File

@@ -11,7 +11,7 @@ import logging
from . import version, config, option, output, extractor, job, util, exception
__author__ = "Mike Fährmann"
__copyright__ = "Copyright 2014-2023 Mike Fährmann"
__copyright__ = "Copyright 2014-2025 Mike Fährmann"
__license__ = "GPLv2"
__maintainer__ = "Mike Fährmann"
__email__ = "mike_faehrmann@web.de"
@@ -78,8 +78,7 @@ def main():
output.configure_standard_streams()
# signals
signals = config.get((), "signals-ignore")
if signals:
if signals := config.get((), "signals-ignore"):
import signal
if isinstance(signals, str):
signals = signals.split(",")
@@ -90,6 +89,19 @@ def main():
else:
signal.signal(signal_num, signal.SIG_IGN)
if signals := config.get((), "signals-actions"):
import signal
for signal_name, action in signals.items():
signal_num = getattr(signal, signal_name, None)
if signal_num is None:
log.warning("signal '%s' is not defined", signal_name)
else:
def handler(signal_num, frame):
signal_name = signal.Signals(signal_num).name
output.stderr_write(f"{signal_name} received\n")
util.FLAGS.__dict__[action.upper()] = "stop"
signal.signal(signal_num, handler)
# enable ANSI escape sequences on Windows
if util.WINDOWS and config.get(("output",), "ansi", output.COLORS):
from ctypes import windll, wintypes, byref