summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Breunig <christian@breunig.cc>2023-05-28 21:14:42 +0200
committerChristian Breunig <christian@breunig.cc>2023-05-28 21:17:43 +0200
commit9c677c81be6a6e62958c73b038c2a36f1f629108 (patch)
tree958e04112283879d3e68efdb4641ecfad26556dd
parent1c83615492b626f4d897a6a0fda9324353aae416 (diff)
downloadvyos-1x-9c677c81be6a6e62958c73b038c2a36f1f629108.tar.gz
vyos-1x-9c677c81be6a6e62958c73b038c2a36f1f629108.zip
vyos.util: extend process_named_running() signature with cmdline
process_named_running() was introduced in commit 16b2fc8fc4ca ("dns-forwarding: T2298: fix path to control file") and thus remained more or less unchanged. Smoketests use process_named_running() heavily and might spawn multiple processes with the same name but ifferent options (e.g. dhcp6c or dhclient) and it was yet not possible to properly filter on the "real-deal" like the process bound to a given interface. One can now optionally specify a string that is searched inside the command line argument list of the process. Example: >>> process_named_running('dhcp6c', 'veth0') ['/usr/sbin/dhcp6c', '-D', '-k', '/run/dhcp6c/dhcp6c.veth0.sock', '-c', '/run/dhcp6c/dhcp6c.veth0.conf', '-p', '/run/dhcp6c/dhcp6c.veth0.pid', 'veth0'] 4215 >>> process_named_running('dhcp6c', 'veth1') ['/usr/sbin/dhcp6c', '-D', '-k', '/run/dhcp6c/dhcp6c.veth1.sock', '-c', '/run/dhcp6c/dhcp6c.veth1.conf', '-p', '/run/dhcp6c/dhcp6c.veth1.pid', 'veth1'] 4253 Where the debug list returned is the commandline searched.
-rw-r--r--python/vyos/util.py11
1 files changed, 7 insertions, 4 deletions
diff --git a/python/vyos/util.py b/python/vyos/util.py
index d5330db13..61ce59324 100644
--- a/python/vyos/util.py
+++ b/python/vyos/util.py
@@ -463,14 +463,17 @@ def process_running(pid_file):
pid = f.read().strip()
return pid_exists(int(pid))
-def process_named_running(name):
+def process_named_running(name, cmdline: str=None):
""" Checks if process with given name is running and returns its PID.
If Process is not running, return None
"""
from psutil import process_iter
- for p in process_iter():
- if name in p.name():
- return p.pid
+ for p in process_iter(['name', 'pid', 'cmdline']):
+ if cmdline:
+ if p.info['name'] == name and cmdline in p.info['cmdline']:
+ return p.info['pid']
+ elif p.info['name'] == name:
+ return p.info['pid']
return None
def is_list_equal(first: list, second: list) -> bool: