mwan3: remove pgrep usage

pgrep is pretty slow as it needs to read all /proc/*/cmdline
or /proc/*/status, and it's called twice per wan.
Add STARTED and PID files to speedup mwan3_get_mwan3track_status().

Signed-off-by: Etienne Champetier <champetier.etienne@gmail.com>
This commit is contained in:
Etienne Champetier
2025-06-27 19:18:49 -04:00
committed by Florian Eckert
parent f93b00fa68
commit de98fdebef
2 changed files with 44 additions and 22 deletions

View File

@@ -94,28 +94,40 @@ readfile() {
mwan3_get_mwan3track_status()
{
local track_ips pid
local interface=$1
local track_ips pid cmdline started
mwan3_list_track_ips()
{
track_ips="$1 $track_ips"
}
config_list_foreach "$1" track_ip mwan3_list_track_ips
config_list_foreach "$interface" track_ip mwan3_list_track_ips
if [ -n "$track_ips" ]; then
pid="$(pgrep -f "mwan3track $1$")"
if [ -n "$pid" ]; then
if [ "$(cat /proc/"$(pgrep -P $pid)"/cmdline)" = "sleep${MAX_SLEEP}" ]; then
tracking="paused"
else
tracking="active"
fi
else
tracking="down"
fi
else
tracking="disabled"
if [ -z "$track_ips" ]; then
echo "disabled"
return
fi
echo "$tracking"
readfile pid $MWAN3TRACK_STATUS_DIR/$interface/PID 2>/dev/null
if [ -z "$pid" ]; then
echo "down"
return
fi
readfile cmdline /proc/$pid/cmdline 2>/dev/null
if [ $cmdline != "/bin/sh/usr/sbin/mwan3track${interface}" ]; then
echo "down"
return
fi
readfile started $MWAN3TRACK_STATUS_DIR/$interface/STARTED
case "$started" in
0)
echo "paused"
;;
1)
echo "active"
;;
*)
echo "down"
;;
esac
}
mwan3_init()

View File

@@ -36,7 +36,7 @@ if_up() {
LOG info "Detect ifup event on interface ${INTERFACE} (${DEVICE})"
IFDOWN_EVENT=0
IFUP_EVENT=1
STARTED=1
started
stop_subprocs
}
@@ -164,7 +164,7 @@ connecting() {
disabled() {
STATUS='disabled'
echo "disabled" > $MWAN3TRACK_STATUS_DIR/$INTERFACE/STATUS
STARTED=0
stopped
}
firstconnect() {
@@ -187,7 +187,7 @@ firstconnect() {
LOG debug "firstconnect: called on $INTERFACE/$true_iface ($DEVICE). Status is $STATUS. SRC_IP is $SRC_IP"
STARTED=1
started
if [ "$STATUS" = "offline" ]; then
disconnected 1
else
@@ -195,6 +195,16 @@ firstconnect() {
fi
}
stopped() {
STARTED=0
echo 0 > $MWAN3TRACK_STATUS_DIR/$INTERFACE/STARTED
}
started() {
STARTED=1
echo 1 > $MWAN3TRACK_STATUS_DIR/$INTERFACE/STARTED
}
update_status() {
local track_ip=$1
@@ -214,13 +224,13 @@ main() {
INTERFACE=$1
STATUS=""
STARTED=0
mkdir -p $MWAN3TRACK_STATUS_DIR/$INTERFACE
echo $$ > $MWAN3TRACK_STATUS_DIR/$INTERFACE/PID
stopped
TRACK_OUTPUT=$MWAN3TRACK_STATUS_DIR/$INTERFACE/TRACK_OUTPUT
mwan3_init
mkdir -p $MWAN3TRACK_STATUS_DIR/$INTERFACE
trap clean_up TERM
trap if_down USR1
trap if_up USR2