Bash-Skript zur Überprüfung, ob ein Prozess ausgeführt wird, funktioniert nicht

7

Ich habe ein einfaches Skript wie das folgende, das prüft, ob der fail2ban- Dienst unter Ubuntu 18.04 ausgeführt wird oder nicht:

#!/bin/bash

# Script to check if fail2ban service is running

if pgrep -x "fail2ban" > /dev/null
then
   echo "Fail2ban is running"
else
   echo "Fail2ban is not running"
fi

Ich habe fail2ban in einer Test-VM installiert und läuft auf der VM. Hier ist ein Screenshot des systemctl statusBefehls.

Aber wenn das obige Skript ausgeführt wird, erhalte ich das Ergebnis, dass "Fail2ban nicht ausgeführt wird". Ich bin nicht sicher, ob es mit dem Skript ist. Ich habe auch versucht, ps auxBefehl statt pgrep. Aber ich bekomme immer noch das gleiche Ergebnis .

skr
quelle
4
Warum überhaupt versuchen, etwas zusammenzubasteln ps, wenn Sie es verwenden können systemctl is-active fail2ban? FWIW Ihr Befehl schlägt wahrscheinlich fehl, weil Sie eine genaue Übereinstimmung angegeben haben ( -x), aber der Prozessname ist tatsächlichfail2ban.server
steeldriver
OK. Vielen Dank. Es hat funktioniert, ich habe den Befehl in den obigen Befehl geändert. Aber wissen Sie auf irgendeine Weise, warum pgrep nicht funktioniert? Ist der Befehl systemctl standardmäßig in allen Redhat-Systemen verfügbar?
skr
@steeldriver Das ist der Service Name, nicht der Prozess Namen.
Leichtigkeitsrennen im Orbit
@LightnessRacesinOrbit mein Fehler, der Prozess ist fail2ban-server(mit einem Bindestrich); pgrep -x fail2ban.serverfindet es, weil es eine Regex-Übereinstimmung ist ( .entspricht der -) und systemctl status fail2ban.servicesagt zum Beispiel Main PID: 2721 (fail2ban-server). Der Servicename ist fail2ban.serv ice, glaube ich.
Steeldriver
@steeldriver Nein, fail2ban ist ein Python-Skript. Der Prozess ist /usr/bin/python3.
Leichtigkeitsrennen im Orbit

Antworten:

13

Sie haben gefragt pgrep, ob Sie genau ( -x) nach einem aufgerufenen Prozess suchen möchten, fail2ban aber die Ausgabe von systemctl statuszeigt, dass er /usr/bin/python3stattdessen aufgerufen wird.

Um zu überprüfen, ob ein systemdGerät läuft, verwenden Sie

systemctl is-active --quiet fail2ban

Das ist:

if systemctl is-active --quiet fail2ban; then
    echo "running"
else
    echo "not running"
fi
PerlDuck
quelle
2
Alternativ könnte man verwenden, pgrep -f '*fail2ban*'um Muster zu finden oder pgrep -f '/usr/bin/python3 /usr/bin/fail2ban-server'genau das zu finden, was Screenshots zeigen
Sergiy Kolodyazhnyy
2
pgrep -f '*fail2ban*'könnte den pgrepBefehl selbst fangen .
Dev
Zumindest auf meinem 16.04-System funktioniert der Prozessname (wie in /proc/<pid>/comm), obwohl es sich um ein Python-Skript handelt, fail2ban-serverso pgrep -x fail2ban-server- obwohl ich keinen Grund sehe, ihn zu verwenden, wenn er systemctl is-activeverfügbar ist
steeldriver
1

Das folgende Shellscript runningkombiniert das Ergebnis von

  • systemctl is-active und
  • ps -ef | ... | grep

um festzustellen, ob ein bestimmtes Programm (oder ein Programmname, der die Suchzeichenfolge enthält) ausgeführt wird oder nicht.

#!/bin/bash

if [ $# -ne 1 ]
then
 echo "Usage:    $0 <program-name>
          $0 <part of program name>
Examples: $0 firefox
          $0 term
          $0 dbus
          $0 'dbus-daemon --session'"
 exit
fi

inversvid="\0033[7m"
resetvid="\0033[0m"
redback="\0033[1;37;41m"
greenback="\0033[1;37;42m"
blueback="\0033[1;37;44m"

runn=false
tmpfil=$(mktemp)

# check by systemctl

systemctl is-active --quiet "$1"
if [ $? -eq 0 ]
then
 echo "systemctl is-active:"
 runn=true
fi

# check by ps

ps -ef | tr -s ' ' ' ' | cut -d ' ' -f 8-9 | grep "$1" | grep -vE -e "$0 $1" -e "grep $1" | sort -u > "$tmpfil"

tmpstr=$(head -n1 $tmpfil)
#echo "$tmpstr"
if [ "$tmpstr" == "$1" ] || [ "${tmpstr##*/}" == "$1" ] || [ "${1##*/}" == "${0##*/}" ]
then
 echo "ps -ef: active:"
 runn=true
elif test -s "$tmpfil"
then
 if $runn
 then
  echo "----- consider also ---------------------------------------------"
  cat "$tmpfil"
  echo "-----------------------------------------------------------------"
 else
  echo "----- try with: -------------------------------------------------"
  cat "$tmpfil"
  echo "-----------------------------------------------------------------"
 fi
fi

if $runn
then
 echo -e "$greenback $1 is running $resetvid"
else
 inpath=$(which "$1")
 if [ "$inpath" == "" ]
 then
  echo -e "$redback no path found to $1 $resetvid"
 else
  echo -e "$blueback $1 is not running $resetvid"
 fi
fi

Machen Sie es ausführbar und legen Sie es in einem Verzeichnis in PATH ab, wenn Sie möchten. Ich habe es in mein binVerzeichnis gestellt und kann es ohne Pfad verwenden.

Verwendungszweck:

$ running 
Usage:    /home/sudodus/bin/running <program-name>
          /home/sudodus/bin/running <part of program name>
Examples: /home/sudodus/bin/running firefox
          /home/sudodus/bin/running term
          /home/sudodus/bin/running dbus
          /home/sudodus/bin/running 'dbus-daemon --session'

Beispiele:

$ running firefox
ps -ef: active:
 firefox is running   # green background - running

$ running term
----- try with: -------------------------------------------------
/usr/lib/gnome-terminal/gnome-terminal-server
xterm
x-terminal-emulator
-----------------------------------------------------------------
 no path found to term   # red background - path not found

$ running dbus
systemctl is-active:
----- consider also ---------------------------------------------
/usr/bin/dbus-daemon --session
/usr/bin/dbus-daemon --syslog
/usr/bin/dbus-daemon --system
/usr/bin/fcitx-dbus-watcher unix:abstract=/tmp/dbus-Nm2MSvuTZF,guid=25bad8d51276d088045625055c425080
-----------------------------------------------------------------
 dbus is running   # green background

$ running 'dbus-daemon --session'
ps -ef: active:
 dbus-daemon --session is running   # green background

$ running libreoffice
 libreoffice is not running    # blue background - not running
Sudodus
quelle