1

所以,我想知道是否有一种方法可以查看是否可以使用 bash 在产生超过 X 数量的情况下杀死进程的 PID。例如:

假设我们有 10 个使用单独的 PID 运行的 php 进程,所有这些进程都使用命令 /usr/bin/php。如果它达到 10 个进程,有没有办法用 bash 脚本杀死它?(我将让这个脚本在前台使用终端全时运行)

4

5 回答 5

2

恕我直言,您正在解决错误的问题。我宁愿确保进程本身不能有多个实例(这里是一个实现清单),并通过某种指令堆栈给出指令。

于 2012-10-20T23:57:48.310 回答
1

以这种方式杀死东西不是一个好主意,但这就是你所要求的。试试这个(全部在一行上):

j=0; for i in `ps fax | grep '/usr/bin/php'  | grep -v grep | awk '{print $1}'`; do let j=j+1; if [ $j -ge 10 ]; then echo "Killing process $i"; kill $i; fi done

注意你在做什么。HTH。

于 2012-10-20T23:35:17.823 回答
0
#!/bin/bash
program_name=php
let max_instances=10
let poll_interval=60

while true; do 
  if (( count=$(ps -eocomm | grep -c "^$program_name$") > max_instances )); then
    killall "$program_name"
    echo "Found $count $program_name processes. Killed."
  fi
  sleep "$poll_interval"
done
于 2012-10-21T02:01:49.723 回答
0

当你杀死 php 进程时,你也会杀死客户端连接,这可能会导致客户不满意和收入损失。

如果您正在运行 apache Web 服务器,则可以限制 http 服务器/客户端连接的数量以及 php 进程的数量。

查看您的 apache conf 文件并注意:

StartServers
MinSpareThreads
MaxSpareThreads
ThreadLimit
ThreadsPerChild
MaxClients
MaxRequestsPerChild

根据您的 PHP 进程的启动方式(suphp、fcgi、...),可能还有其他选项。

其他 Web 服务器提供类似的设置。

于 2012-10-21T19:52:22.503 回答
0

这对我有用:

#!/bin/bash

#PROGRAM_NAME=/usr/bin/php
PROGRAM_NAME="gedit"
MAX_INSTANCES=2
CURRENT_INSTANCES=0

while true
do
    sleep 1
    let CURRENT_INSTANCES=`ps aux | grep -c $PROGRAM_NAME`
    if [ "$CURRENT_INSTANCES" -ge "$MAX_INSTANCES" ];then
        killall $PROGRAM_NAME
        echo "killing program!"
        exit 0;
    fi
done
于 2012-10-21T00:42:34.593 回答