Bash需要检查是否存在多个pid

时间:2017-03-09 22:01:46

标签: bash centos

我构建的脚本需要检查更多进程(pid)是否正在运行相同的进程。如果进程运行了两次,我们需要杀死这个进程。

以下是一个示例,由于某种原因,此过程将运行两次。所以我们需要监控这个并且需要杀死/重启单声道进程。

#!/bin/sh
export PATH=/bin:/sbin:/usr/bin:/usr/sbin

set -x                          # set debug
PID="/usr/local/bin/Serverd.pid"
Service="/etc/init.d/serverd" $1

#
# Functions
#
die (){
   printf '%s\n' "$*" >&2
   exit 1
}

log(){
   logger -t HealthCheck -i $*
}

process () {
   [[ $(pidof mono /dev/null 2>&1) == '' ]] && echo 0 || echo 1
}

pid () {
   [[ ! -r $PID ]] && echo 0 || echo 1
}

for i in $(process); do
   if [[ $i -eq '0' ]]
   then
      echo 'Process is Stoped!!!!!'
      if [[ $(pid) -eq '1' ]]
      then
         echo PID still there, remove PID first
         rm -rf $PID
         $Service start
         exit 1
      else
         $Service start
         exit 1
      fi
   else
      echo 'Process is Running!!!!'
      exit 1
   fi
done

如果我有2个相同单声道进程的PID,则需要将其杀死

+++ pidof mono /dev/null
++ [[ 30454 30014 == '' ]]

我是怎么做的?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您的问题是pidof会返回多个pid的列表,并且您希望将它们全部删除。

如果是这种情况,你可以这样做:

pids=($(pidof mono))
for pid in ${pids[@]:1}; do
    kill -9 $pid
done

此:

  • 将pids放入数组
  • 获取不包含第一个元素
  • 的子数组
  • 杀死该子阵列中的每个项目。