6

I have a simple script as below which checks if fail2ban service is running or not on Ubuntu 18.04:

#!/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

I have installed fail2ban in a test VM and is running on the VM. Here is a screenshot of systemctl status command.

But, when the run the above script, I get the result that "Fail2ban is not running". I am not sure if is with the script. I tried ps aux command too instead of pgrep. But, I still get the same result.

  • 4
    Why even try to cobble something together with ps, when you can use systemctl is-active fail2ban? FWIW your command probably fails because you specified an exact match (-x) but the process name is actually fail2ban.server – steeldriver Jan 18 at 15:55
  • Ok. Thanks. It worked, I changed the command to the above command. But, is there any way you know why pgrep will not work? Also, Is systemctl command available by default in all redhat systems? – skr Jan 18 at 15:58
  • Oh that is right. Thank you so much. – skr Jan 18 at 16:02
  • @steeldriver That's the service name, not the process name. – Lightness Races in Orbit Jan 18 at 18:16
  • @LightnessRacesinOrbit my mistake, the process is fail2ban-server (with a hyphen); pgrep -x fail2ban.server finds it because it's a regex match (. matches the -) and for example systemctl status fail2ban.service says Main PID: 2721 (fail2ban-server). The service name is fail2ban.service I believe. – steeldriver Jan 18 at 19:37
12

You asked pgrep to exactly (-x) search for a process called fail2ban but the output of systemctl status shows it is called /usr/bin/python3 instead.

To check whether a systemd unit is running use

systemctl is-active --quiet fail2ban

That is:

if systemctl is-active --quiet fail2ban; then
    echo "running"
else
    echo "not running"
fi
  • 2
    Alternatively, one could use pgrep -f '*fail2ban*' to pattern-match or pgrep -f '/usr/bin/python3 /usr/bin/fail2ban-server' to match exactly what screenshots reveal – Sergiy Kolodyazhnyy Jan 18 at 20:08
  • 2
    pgrep -f '*fail2ban*' could catch the pgrep command itself. – Dev Jan 18 at 20:16
  • At least on my 16.04 system, in spite of it being a python script, the process name (as seen in /proc/<pid>/comm) is fail2ban-server so pgrep -x fail2ban-server does work - although I see no reason to use it when systemctl is-active is available – steeldriver Jan 18 at 23:17
0

The following shellscript running combines the result of

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

in order to detect if a certain program (or a program name containing the search string) is running or not.

#!/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

Make it executable and put it in a directory in PATH, if you wish. I put it into my bin directory and can used it without any path.

Usage:

$ 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'

Examples:

$ 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

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.