def auto_restart(args): """ Subcommand to start a long-running subprocess and restart it on matched events. :param args: Command line argument options. """ if args.debug_force_polling: from watchdog.observers.polling import PollingObserver as Observer else: from watchdog.observers import Observer from watchdog.tricks import AutoRestartTrick import signal if not args.directories: args.directories = ['.'] # Allow either signal name or number. if args.signal.startswith("SIG"): stop_signal = getattr(signal, args.signal) else: stop_signal = int(args.signal) # Handle termination signals by raising a semantic exception which will # allow us to gracefully unwind and stop the observer termination_signals = {signal.SIGTERM, signal.SIGINT} def handler_termination_signal(_signum, _frame): # Neuter all signals so that we don't attempt a double shutdown for signum in termination_signals: signal.signal(signum, signal.SIG_IGN) raise WatchdogShutdown for signum in termination_signals: signal.signal(signum, handler_termination_signal) patterns, ignore_patterns = parse_patterns(args.patterns, args.ignore_patterns) command = [args.command] command.extend(args.command_args) handler = AutoRestartTrick(command=command, patterns=patterns, ignore_patterns=ignore_patterns, ignore_directories=args.ignore_directories, stop_signal=stop_signal, kill_after=args.kill_after) handler.start() observer = Observer(timeout=args.timeout) try: observe_with(observer, handler, args.directories, args.recursive) except WatchdogShutdown: pass finally: handler.stop()
def test_auto_restart_subprocess_termination(tmpdir, capfd): from watchdog.tricks import AutoRestartTrick import sys import time script = make_dummy_script(tmpdir, n=2) a = AutoRestartTrick([sys.executable, script]) a.start() time.sleep(5) a.stop() cap = capfd.readouterr() assert cap.out.splitlines(keepends=False).count('+++++ 0') > 1
def test_kill_auto_restart(tmpdir, capfd): from watchdog.tricks import AutoRestartTrick import sys import time script = make_dummy_script(tmpdir) a = AutoRestartTrick([sys.executable, script]) a.start() time.sleep(3) a.stop() cap = capfd.readouterr() assert '+++++ 0' in cap.out assert '+++++ 9' not in cap.out # we killed the subprocess before the end
def auto_restart(args): """ Subcommand to start a long-running subprocess and restart it on matched events. :param args: Command line argument options. """ if args.debug_force_polling: from watchdog.observers.polling import PollingObserver as Observer else: from watchdog.observers import Observer from watchdog.tricks import AutoRestartTrick import signal import re if not args.directories: args.directories = ['.'] # Allow either signal name or number. if re.match('^SIG[A-Z]+$', args.signal): stop_signal = getattr(signal, args.signal) else: stop_signal = int(args.signal) # Handle SIGTERM in the same manner as SIGINT so that # this program has a chance to stop the child process. def handle_sigterm(_signum, _frame): raise KeyboardInterrupt() signal.signal(signal.SIGTERM, handle_sigterm) patterns, ignore_patterns = parse_patterns(args.patterns, args.ignore_patterns) command = [args.command] command.extend(args.command_args) handler = AutoRestartTrick(command=command, patterns=patterns, ignore_patterns=ignore_patterns, ignore_directories=args.ignore_directories, stop_signal=stop_signal, kill_after=args.kill_after) handler.start() observer = Observer(timeout=args.timeout) observe_with(observer, handler, args.directories, args.recursive) handler.stop()
def auto_restart(args): """ Subcommand to start a long-running subprocess and restart it on matched events. :param args: Command line argument options. """ if args.debug_force_polling: from watchdog.observers.polling import PollingObserver as Observer else: from watchdog.observers import Observer from watchdog.tricks import AutoRestartTrick import signal if not args.directories: args.directories = ['.'] # Allow either signal name or number. if args.signal.startswith("SIG"): stop_signal = getattr(signal, args.signal) else: stop_signal = int(args.signal) # Handle SIGTERM in the same manner as SIGINT so that # this program has a chance to stop the child process. def handle_sigterm(_signum, _frame): raise KeyboardInterrupt() signal.signal(signal.SIGTERM, handle_sigterm) patterns, ignore_patterns = parse_patterns(args.patterns, args.ignore_patterns) command = [args.command] command.extend(args.command_args) handler = AutoRestartTrick(command=command, patterns=patterns, ignore_patterns=ignore_patterns, ignore_directories=args.ignore_directories, stop_signal=stop_signal, kill_after=args.kill_after) handler.start() observer = Observer(timeout=args.timeout) observe_with(observer, handler, args.directories, args.recursive) handler.stop()
def auto_restart(args): """ Subcommand to start a long-running subprocess and restart it on matched events. :param args: Command line argument options. """ from watchdog.observers import Observer from watchdog.tricks import AutoRestartTrick import signal import re if not args.directories: args.directories = ['.'] if re.match('^SIG[A-Z]+$', args.signal): stop_signal = getattr(signal, args.signal) else: stop_signal = int(args.signal) def handle_sigterm(_signum, _frame): raise KeyboardInterrupt() signal.signal(signal.SIGTERM, handle_sigterm) patterns, ignore_patterns = parse_patterns(args.patterns, args.ignore_patterns) command = [args.command] command.extend(args.command_args) handler = AutoRestartTrick(command=command, patterns=patterns, ignore_patterns=ignore_patterns, ignore_directories=args.ignore_directories, stop_signal=stop_signal, kill_after=args.kill_after) handler.start() observer = Observer(timeout=args.timeout) observe_with(observer, handler, args.directories, args.recursive) handler.stop()
def auto_restart(args): from watchdog.observers import Observer from watchdog.tricks import AutoRestartTrick import signal import re if not args.directories: args.directories = ['.'] if re.match('^SIG[A-Z]+$', args.signal): stop_signal = getattr(signal, args.signal) else: stop_signal = int(args.signal) def handle_sigterm(_signum, _frame): raise KeyboardInterrupt() signal.signal(signal.SIGTERM, handle_sigterm) patterns, ignore_patterns = parse_patterns(args.patterns, args.ignore_patterns) command = [args.command] command.extend(args.command_args) handler = AutoRestartTrick(command=command, patterns=patterns, ignore_patterns=ignore_patterns, ignore_directories=args.ignore_directories, stop_signal=stop_signal, kill_after=args.kill_after) handler.start() observer = Observer(timeout=args.timeout) observe_with(observer, handler, args.directories, args.recursive) handler.stop()