diff options
| author | Alexander Barton <alex@barton.de> | 2024-04-01 21:38:21 +0200 |
|---|---|---|
| committer | Alexander Barton <alex@barton.de> | 2024-04-05 23:16:07 +0200 |
| commit | 22a8744476dff7763cd94954bd8f96fbdfc0d251 (patch) | |
| tree | cb987bbaaca39b05ffb3547d765a0f5e9f9db608 /src | |
| parent | 7e78c293a97239f895b862836c65c4b755abdc52 (diff) | |
| download | ngircd-22a8744476dff7763cd94954bd8f96fbdfc0d251.tar.gz ngircd-22a8744476dff7763cd94954bd8f96fbdfc0d251.zip | |
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.
Diffstat (limited to 'src')
| -rwxr-xr-x | src/testsuite/getpid.sh | 69 |
1 files 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 <name>" >&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 |