#!/usr/bin/python3 import argparse import subprocess import time parser = argparse.ArgumentParser(description = 'Run a command on matching udev events') parser.add_argument('-s', '--subsystem') parser.add_argument('-m', '--match', action = 'append') parser.add_argument('command') args = parser.parse_args() def process_buf(buf): for m in args.match: if not m in buf: return subprocess.run(args.command, shell = True) cmdline = ['udevadm', 'monitor', '--property'] if args.subsystem: cmdline.append('--subsystem-match=' + args.subsystem) child = subprocess.Popen(cmdline, text = True, stdout = subprocess.PIPE) try: # skip first three lines [child.stdout.readline() for i in range(3)] buf = [] while child.poll() is None: line = child.stdout.readline().strip() if not line: process_buf(buf) buf.clear() continue buf.append(line) finally: child.terminate() if child.returncode is None: time.sleep(0.1) child.kill()