File: //proc/thread-self/root/etc/zabbix/monitoring/check_php_fpm.sh
#!/bin/bash
ACTION=$1
SERVICE=$2
# Função para listar os serviços sem depender do systemctl
get_services() {
find /etc/systemd/system /usr/lib/systemd/system -name "php[0-9][0-9]-php-fpm.service" 2>/dev/null | awk -F'/' '{print $NF}' | sort -u
}
# Função para checar o status checando os processos ao invés do systemctl
is_active() {
local srv=$1
local base_name=${srv%.service}
local prefix=${base_name%%-*}
# Verifica se é php 5.3, 5.4 ou 5.5 para arrumar o formato de busca
if [[ "$prefix" == "php53" || "$prefix" == "php54" || "$prefix" == "php55" ]]; then
# Extrai os números e coloca um ponto (ex: 5.3)
local ver_num=${prefix:3}
local search_term="${ver_num:0:1}.${ver_num:1:1}"
else
# Para as outras versões usa a string inteira (ex: php74)
local search_term="$prefix"
fi
# Verifica se existe o processo na memória ignorando o grep e o próprio script
if ps aux | grep -v grep | grep -v "check_php_fpm" | grep -q "$search_term/php-fpm"; then
return 0 # Rodando
else
return 1 # Parado
fi
}
case $ACTION in
discovery)
# Retorna JSON para o LLD do Zabbix
SERVICES=$(get_services)
FIRST=1
echo '{"data":['
for S in $SERVICES; do
if [ $FIRST -eq 0 ]; then echo ","; fi
echo -n ' {"{#PHP_SERVICE}":"'$S'"}'
FIRST=0
done
echo ""
echo ']}'
;;
status)
# Retorna 1 se estiver running, 0 caso contrário
if is_active "$SERVICE"; then
echo 1
else
echo 0
fi
;;
down_count)
# Conta o total de serviços fora do ar
SERVICES=$(get_services)
DOWN=0
for S in $SERVICES; do
if ! is_active "$S"; then
DOWN=$((DOWN+1))
fi
done
echo $DOWN
;;
down_list)
# Retorna "OK" ou uma string concatenada com os serviços parados
DOWN_SERVICES=""
SERVICES=$(get_services)
for S in $SERVICES; do
if ! is_active "$S"; then
if [ -z "$DOWN_SERVICES" ]; then
DOWN_SERVICES="$S"
else
DOWN_SERVICES="$DOWN_SERVICES, $S"
fi
fi
done
if [ -z "$DOWN_SERVICES" ]; then
echo "OK"
else
echo "$DOWN_SERVICES"
fi
;;
*)
echo "Uso: $0 (discovery|status <servico>|down_count|down_list)"
exit 1
;;
esac