8

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.

5
  • 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 Jan 18, 2019 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, 2019 at 15:58
  • @steeldriver That's the service name, not the process name. Jan 18, 2019 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. Jan 18, 2019 at 19:37
  • @steeldriver Nope, fail2ban is a Python script. The process is /usr/bin/python3. Jan 18, 2019 at 20:37

2 Answers 2

13

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
3
  • 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 Jan 18, 2019 at 20:08
  • 2
    pgrep -f '*fail2ban*' could catch the pgrep command itself.
    – Dev
    Jan 18, 2019 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 Jan 18, 2019 at 23:17
1

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

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .