Bash - sprawdzenie czy proces jest aktywny z najmniejszymi uprawnieniami

Bash Musiałem zrobić skrypt gdzie odpytuję usługi i sprawdzam czy "żyją" i podaję kod wyjśćia dla nagiosa.

Wymaganie było aby zrobić to przy jak najmniejszym nadawaniu uprawnień.

Niby prosta komenda systemctl is-active *.service jest dobra ale zdalne wykonanie skryptu przez nrpe nie chciało zaskoczyć. Czały cas w logach były komunikaty o u słabych uprawnieniach

Skrypt wykonałem w Bash-u zaprzęgając do tego poczciwą komendę ps. Reszta to już tylko tablice. Dodatkowo problemem było jeszcze nazewnictwo usług. Np Tomcat posiada proces java, a baza danych PostgreSQL uruchamia proces posmaster. W skrypcie uwzględniłem taki przypadek. Choć wiem, że nie jest elastyczny (można zrobić porównanie po stringach, a nie po indeksach).

#!/bin/bash

nameS=(httpd java postmaster)
licznik1=0
for i in ${nameS[@]}
do
    ps -C $i >/dev/null
    if [ $? -eq 0 ];then 
        if [ $licznik1 -eq 1 ];then
            wynikP[$licznik1]="Service Tomcat is active"
            ((licznik1++))
        elif [ $licznik1 -eq 2 ];then
                        wynikP[$licznik1]="Service PostgreSQL is active"
        else    
            wynikP[$licznik1]="Service $i is active"
            ((licznik1++))
        fi
    else
        if [ $licznik1 -eq 1 ];then
                        wynikF[$licznik1]="Service Tomcat is inactive"
                        ((licznik1++))
                elif [ $licznik1 -eq 2 ];then
                        wynikF[$licznik1]="Service PostgreSQL is inactive"
                else
                        wynikF[$licznik1]="Service $i is inactive"
                        ((licznik1++))
                fi
    fi
done

if [ ${#wynikP[@]} -eq 3 ];then
    echo "All services is active: ${wynikP[@]}"
    exit 0
else
    echo "${wynikF[@]}"
    exit 2
fi

Aktualizacja: 20 wrzesień 2020r.

Skorygowałem skrypt na taki, który nie używa tablic indeksowych tylko polecenia case. Wydaje się prostszy.

#!/bin/bash

nameS=(upowerd gnome-shell nautilus)
SUCCESS=""
FAILED=""

for i in ${nameS[@]}
do
    ps -C $i >/dev/null
    if [ $? -eq 0 ];then 
        case $i in
          "upowerd")
            SUCCESS+="Service $i is active " ;;
          "gnome-shell")
            SUCCESS+="Service Gnome is active " ;;
          "nautilus")
            SUCCESS+="Service Menadzer plikow is active" ;;
        esac
        else
          case $i in
          "upowerd")
            FAILED+="Service $i is deactive ";;
          "gnome-shell")
            FAILED+="Service Gnome is deactive ";;
          "nautilus")
            FAILED+="Service Manadzer plikow is deactive";;
        esac
    fi
done

if [ -z "$FAILED" ];then
    echo "$SUCCESS"
    exit 0
else
    echo "$FAILED"
    exit 2
fi