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

分享于 

5分钟阅读

ubuntu

 

问题:

我有一个简单的脚本,它检查 fail2ban 服务是否正在运行,或者是否在 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



我已经在一个测试VM中安装了 fail2ban,并且正在VM上运行。 这里是一个命令的截图。

但是,当运行上面的脚本时,我得到了"fail2ban未运行"的结果。 我不确定这个脚本。 我尝试了 ps aux 命令而不是 pgrep。 不过,我仍然得到同样的结果。


回答 1:

pgrep 中,你要求精确搜索一个称为的进程,但是 systemctl status的输出显示它被称为 /usr/bin/python3

检查 systemd 单元是否正在运行


systemctl is-active --quiet fail2ban



也就是:


if systemctl is-active --quiet fail2ban; then


 echo"running"


else


 echo"not running"


fi




回答 2:

下面的shellscript running 将结果合并到

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

为了检测某个程序( 或者包含搜索字符串的程序 NAME ) 是否正在运行或者是否运行。


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



使它可以执行并将它的放入路径中的目录中,如果你希望。 我将它放入 bin 目录中,无需任何路径即可使用它。

使用方法:


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



例如:


$ 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