From 22a8744476dff7763cd94954bd8f96fbdfc0d251 Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Mon, 1 Apr 2024 21:38:21 +0200 Subject: [PATCH] Test suite: simplify and enhance getpid.sh - Try to only search for processes of the current user. - Prefer using pgrep (in addition to pidof) when available. - Streamline system overrides. - Get rid of HEAD_FLAGS: all systems so far support "-1". - Use "ps -o pid,comm" as the default, which is POSIX.1. - Use "sort -r" to hopefully get the newest (=highest) PID, which is the case on older systems not using randomized PIDs at least. --- src/testsuite/getpid.sh | 69 ++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/src/testsuite/getpid.sh b/src/testsuite/getpid.sh index 55997ad8..465def64 100755 --- a/src/testsuite/getpid.sh +++ b/src/testsuite/getpid.sh @@ -1,46 +1,57 @@ #!/bin/sh # ngIRCd Test Suite +# +# Try to detect the PID of a running process of the current user. +# set -u # did we get a name? -[ $# -ne 1 ] && exit 1 - -[ -x /bin/pidof ] && exec /bin/pidof -s "$1" +if [ $# -ne 1 ]; then + echo "Usage: $0 " >&2 + exit 1 +fi -# detect flags for "ps" and "head" UNAME=`uname` -if [ $UNAME = "FreeBSD" ]; then - PS_FLAGS="-a"; PS_PIDCOL="1"; HEAD_FLAGS="-n 1" -elif [ $UNAME = "A/UX" ]; then - PS_FLAGS="-af"; PS_PIDCOL="2"; HEAD_FLAGS="-1" -elif [ $UNAME = "GNU" ]; then - PS_FLAGS="-ax"; PS_PIDCOL="2"; HEAD_FLAGS="-n 1" -elif [ $UNAME = "Haiku" ]; then - PS_FLAGS="-o Id -o Team"; PS_PIDCOL="1"; HEAD_FLAGS="-1" -elif [ $UNAME = "Linux" ]; then - PS_FLAGS="ax"; PS_PIDCOL="1"; HEAD_FLAGS="-n 1" -elif [ $UNAME = "SunOS" ]; then - PS_FLAGS="-af"; PS_PIDCOL=2; HEAD_FLAGS="-n 1" -else - PS_FLAGS="-af"; PS_PIDCOL="2"; HEAD_FLAGS="-n 1" - ps $PS_FLAGS >/dev/null 2>&1 - if [ $? -ne 0 ]; then PS_FLAGS="a"; PS_PIDCOL="1"; fi + +# Use pgrep(1) whenever possible +if [ -x /usr/bin/pgrep ]; then + case "$UNAME" in + "FreeBSD") + PGREP_FLAGS="-a" + ;; + *) + PGREP_FLAGS="" + esac + exec /usr/bin/pgrep $PGREP_FLAGS -n -u "$LOGNAME" "$1" fi -# debug output -#echo "$0: UNAME=$UNAME" -#echo "$0: PS_FLAGS=$PS_FLAGS" -#echo "$0: PS_PIDCOL=$PS_PIDCOL" -#echo "$0: HEAD_FLAGS=$HEAD_FLAGS" +# pidof(1) could be a good alternative on elder Linux systems +if [ -x /bin/pidof ]; then + exec /bin/pidof -s "$1" +fi + +# fall back to ps(1) and parse its output: +# detect flags for "ps" and "head" +PS_PIDCOL=1 +case "$UNAME" in + "A/UX"|"GNU"|"SunOS") + PS_FLAGS="-a"; PS_PIDCOL=2 + ;; + "Haiku") + PS_FLAGS="-o Id -o Team" + ;; + *) + # Linux (GNU coreutils), Free/Net/OpenBSD, ... + PS_FLAGS="-o pid,comm" +esac # search PID ps $PS_FLAGS >procs.tmp -cat procs.tmp | \ - grep -v "$0" | grep "$1" | \ +grep -v "$$" procs.tmp | grep "$1" | \ awk "{print \$$PS_PIDCOL}" | \ - sort -n >pids.tmp -pid=`head $HEAD_FLAGS pids.tmp` + sort -nr >pids.tmp +pid=`head -1 pids.tmp` rm -rf procs.tmp pids.tmp # validate PID -- 2.39.2