Bash script to verify if a process is running is not working
Solution 1
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
Solution 2
The following shellscript running
combines the result of
systemctl is-active
andps -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
skr
Updated on September 18, 2022Comments
-
skr over 1 year
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 ofpgrep
. But, I still get the same result.-
steeldriver over 5 yearsWhy even try to cobble something together with
ps
, when you can usesystemctl is-active fail2ban
? FWIW your command probably fails because you specified an exact match (-x
) but the process name is actuallyfail2ban.server
-
skr over 5 yearsOk. 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?
-
Lightness Races in Orbit over 5 years@steeldriver That's the service name, not the process name.
-
steeldriver over 5 years@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 examplesystemctl status fail2ban.service
saysMain PID: 2721 (fail2ban-server)
. The service name is fail2ban.service I believe. -
Lightness Races in Orbit over 5 years@steeldriver Nope, fail2ban is a Python script. The process is
/usr/bin/python3
.
-
-
Sergiy Kolodyazhnyy over 5 yearsAlternatively, one could use
pgrep -f '*fail2ban*'
to pattern-match orpgrep -f '/usr/bin/python3 /usr/bin/fail2ban-server'
to match exactly what screenshots reveal -
Dev over 5 years
pgrep -f '*fail2ban*'
could catch thepgrep
command itself. -
steeldriver over 5 yearsAt least on my 16.04 system, in spite of it being a python script, the process name (as seen in
/proc/<pid>/comm
) isfail2ban-server
sopgrep -x fail2ban-server
does work - although I see no reason to use it whensystemctl is-active
is available