したがって、Xを超える量が生成された場合に、bashを使用してプロセスのPIDを強制終了できるかどうかを確認する方法があるかどうか疑問に思いました。例えば:
コマンド/usr/ bin/phpを使用して個別のPIDで実行されている10個のphpプロセスがあるとします。10プロセスに達した場合、bashスクリプトでそれを強制終了する方法はありますか?(このスクリプトは、ターミナルを使用してフォアグラウンドでフルタイムで実行されます)
IMHO、あなたは間違った問題を解決しています。プロセス自体が複数のインスタンスを持つことができないことを確認し (ここに実装チェックリストがあります)、何らかの命令スタックによって命令を与えます。
この方法で物を殺すのは良い考えではありませんが、これはあなたが尋ねたものです。これを試してみてください(すべて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。
PHP プロセスを強制終了すると、クライアント接続も強制終了されるため、顧客が満足せず、収益が失われる可能性があります。
Apache Web サーバーを実行している場合は、http サーバー/クライアント接続の数を制限して、php プロセスの数を制限できます。
Apache conf ファイルを調べて、次の点に注意してください。
StartServers
MinSpareThreads
MaxSpareThreads
ThreadLimit
ThreadsPerChild
MaxClients
MaxRequestsPerChild
PHP プロセスの開始方法 (suphp、fcgi など) によっては、他のオプションもある場合があります。
他の Web サーバーも同様の設定を提供します。
これは私のために働いた:
#!/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
#!/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