Bash脚本来验证进程是否正在运行

分享于 

分钟阅读

 
点击句子查看译文 显示原文      显示译文      双语对照    源址


Question :

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.


Answer 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




Answer 2 :

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="033[7m"


resetvid="033[0m"


redback="033[1;37;41m"


greenback="033[1;37;42m"


blueback="033[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





PROC  BASH  bash-script  Verify