service-manager.sh
Niveau : Dรฉbutant
Gestion simplifiรฉe des services systemd.
Description
Ce script facilite la gestion des services : - Liste des services avec statut - Dรฉmarrage/arrรชt/redรฉmarrage - Affichage des logs - Vรฉrification santรฉ
Prรฉrequis
- Systรจme : Linux (RHEL/Debian)
- Permissions : Utilisateur standard pour consultation, sudo pour modifications
- Dรฉpendances :
systemctl,journalctl
Cas d'Usage
- Interface simplifiรฉe systemd : Gestion intuitive des services sans mรฉmoriser les commandes systemctl
- Monitoring rapide : Vue d'ensemble rapide de l'รฉtat des services critiques
- Investigation de pannes : Consultation rapide des logs et statuts lors d'incidents
- Administration quotidienne : Restart, enable/disable de services en quelques commandes
Script
#!/bin/bash
#===============================================================================
# Script Name: service-manager.sh
# Description: Gestion des services systemd
# Author: ShellBook
# Version: 1.0
#===============================================================================
set -euo pipefail
# Colors
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly CYAN='\033[0;36m'
readonly BOLD='\033[1m'
readonly NC='\033[0m'
usage() {
cat << EOF
Usage: $(basename "$0") [COMMAND] [SERVICE]
Gestion simplifiรฉe des services systemd.
Commands:
list Liste tous les services
status [SERVICE] Affiche le statut d'un service
start SERVICE Dรฉmarre un service
stop SERVICE Arrรชte un service
restart SERVICE Redรฉmarre un service
enable SERVICE Active au dรฉmarrage
disable SERVICE Dรฉsactive au dรฉmarrage
logs SERVICE Affiche les logs
health Vรฉrifie la santรฉ des services
Options:
-h, --help Show this help
Examples:
$(basename "$0") list
$(basename "$0") status nginx
$(basename "$0") restart apache2
$(basename "$0") logs mysql -f
EOF
}
print_header() {
echo -e "${CYAN}โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ${NC}"
echo -e "${BOLD} $1${NC}"
echo -e "${CYAN}โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ${NC}"
}
status_color() {
local status=$1
case "$status" in
active|running) echo -e "${GREEN}โ${NC}" ;;
inactive|dead) echo -e "${RED}โ${NC}" ;;
failed) echo -e "${RED}โ${NC}" ;;
*) echo -e "${YELLOW}?${NC}" ;;
esac
}
list_services() {
print_header "SERVICES SYSTEMD"
echo ""
printf " ${CYAN}%-4s %-30s %-10s %-10s${NC}\n" "ST" "SERVICE" "STATE" "ENABLED"
printf " %-4s %-30s %-10s %-10s\n" "----" "------------------------------" "----------" "----------"
systemctl list-units --type=service --all --no-pager 2>/dev/null | \
grep "\.service" | \
while read -r line; do
local unit=$(echo "$line" | awk '{print $1}' | sed 's/\.service//')
local load=$(echo "$line" | awk '{print $2}')
local active=$(echo "$line" | awk '{print $3}')
local sub=$(echo "$line" | awk '{print $4}')
local enabled=$(systemctl is-enabled "$unit" 2>/dev/null || echo "unknown")
local status_icon=$(status_color "$active")
printf " %s %-30s %-10s %-10s\n" "$status_icon" "${unit:0:30}" "$active" "$enabled"
done | head -30
echo ""
echo " ... (limitรฉ ร 30 services)"
echo ""
# Rรฉsumรฉ
local running=$(systemctl list-units --type=service --state=running --no-pager 2>/dev/null | grep -c "\.service" || echo "0")
local failed=$(systemctl list-units --type=service --state=failed --no-pager 2>/dev/null | grep -c "\.service" || echo "0")
echo -e " ${GREEN}Running:${NC} $running ${RED}Failed:${NC} $failed"
}
show_status() {
local service=$1
print_header "STATUS: $service"
# Statut dรฉtaillรฉ
systemctl status "$service" --no-pager 2>/dev/null || true
echo ""
# Informations supplรฉmentaires
echo -e "${CYAN}โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ${NC}"
local enabled=$(systemctl is-enabled "$service" 2>/dev/null || echo "unknown")
local active=$(systemctl is-active "$service" 2>/dev/null || echo "unknown")
local pid=$(systemctl show "$service" --property=MainPID --value 2>/dev/null || echo "N/A")
local memory=$(systemctl show "$service" --property=MemoryCurrent --value 2>/dev/null || echo "N/A")
echo -e " ${BOLD}Enabled:${NC} $enabled"
echo -e " ${BOLD}Active:${NC} $active"
echo -e " ${BOLD}Main PID:${NC} $pid"
if [[ "$memory" != "N/A" ]] && [[ "$memory" != "[not set]" ]]; then
local mem_mb=$((memory / 1048576))
echo -e " ${BOLD}Memory:${NC} ${mem_mb}M"
fi
}
service_action() {
local action=$1
local service=$2
echo -e "${CYAN}Exรฉcution: systemctl $action $service${NC}"
if systemctl "$action" "$service"; then
echo -e "${GREEN}[OK]${NC} $service $action"
# Display le nouveau statut
sleep 1
local status=$(systemctl is-active "$service" 2>/dev/null || echo "unknown")
echo -e " Nouveau statut: $status"
else
echo -e "${RED}[FAIL]${NC} $service $action"
return 1
fi
}
show_logs() {
local service=$1
shift
local extra_args="$@"
print_header "LOGS: $service"
journalctl -u "$service" --no-pager -n 50 $extra_args
}
health_check() {
print_header "SANTร DES SERVICES"
# Services critiques
local critical_services=("sshd" "ssh" "systemd-journald" "systemd-logind" "dbus" "cron" "rsyslog")
echo ""
echo -e " ${BOLD}Services Critiques:${NC}"
for svc in "${critical_services[@]}"; do
if systemctl list-units --type=service --all 2>/dev/null | grep -q "$svc"; then
local status=$(systemctl is-active "$svc" 2>/dev/null || echo "not found")
local icon=$(status_color "$status")
printf " %s %-20s %s\n" "$icon" "$svc" "$status"
fi
done
# Services faileds
echo ""
echo -e " ${BOLD}Services รchouรฉs:${NC}"
local failed_services=$(systemctl list-units --type=service --state=failed --no-pager 2>/dev/null | grep "\.service" || true)
if [[ -n "$failed_services" ]]; then
echo "$failed_services" | while read -r line; do
local unit=$(echo "$line" | awk '{print $2}')
echo -e " ${RED}โ${NC} $unit"
done
else
echo -e " ${GREEN}Aucun service failed${NC}"
fi
# Services avec beaucoup de mรฉmoire
echo ""
echo -e " ${BOLD}Top 5 Services (Memory):${NC}"
systemctl list-units --type=service --state=running --no-pager 2>/dev/null | \
grep "\.service" | \
awk '{print $1}' | \
while read -r svc; do
local mem=$(systemctl show "$svc" --property=MemoryCurrent --value 2>/dev/null)
if [[ -n "$mem" ]] && [[ "$mem" != "[not set]" ]] && [[ "$mem" -gt 0 ]]; then
echo "$mem $svc"
fi
done | sort -rn | head -5 | \
while read -r mem svc; do
local mem_mb=$((mem / 1048576))
printf " %-30s %sM\n" "${svc%.service}" "$mem_mb"
done
# Rรฉsumรฉ
echo ""
echo -e "${CYAN}โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ${NC}"
local total=$(systemctl list-units --type=service --no-pager 2>/dev/null | grep -c "\.service" || echo "0")
local running=$(systemctl list-units --type=service --state=running --no-pager 2>/dev/null | grep -c "\.service" || echo "0")
local failed_count=$(systemctl list-units --type=service --state=failed --no-pager 2>/dev/null | grep -c "\.service" || echo "0")
echo -e " Total: $total | ${GREEN}Running: $running${NC} | ${RED}Failed: $failed_count${NC}"
}
main() {
if [[ $# -eq 0 ]]; then
usage
exit 0
fi
local command=$1
shift
case "$command" in
list)
list_services
;;
status)
if [[ $# -eq 0 ]]; then
health_check
else
show_status "$1"
fi
;;
start|stop|restart|enable|disable|reload)
if [[ $# -eq 0 ]]; then
echo "Error: Service requis"
exit 1
fi
service_action "$command" "$1"
;;
logs)
if [[ $# -eq 0 ]]; then
echo "Error: Service requis"
exit 1
fi
show_logs "$@"
;;
health)
health_check
;;
-h|--help)
usage
;;
*)
echo "Commande inconnue: $command"
usage
exit 1
;;
esac
}
main "$@"
Usage
# Rendre exรฉcutable
chmod +x service-manager.sh
# Liste des services
./service-manager.sh list
# Statut d'un service
./service-manager.sh status nginx
# Gรฉrer un service
sudo ./service-manager.sh start nginx
sudo ./service-manager.sh restart mysql
sudo ./service-manager.sh stop apache2
# Logs
./service-manager.sh logs nginx
./service-manager.sh logs mysql -f # Follow
# Santรฉ globale
./service-manager.sh health
Sortie Exemple
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
SERVICES SYSTEMD
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
ST SERVICE STATE ENABLED
---- ------------------------------ ---------- ----------
โ cron active enabled
โ dbus active static
โ nginx active enabled
โ apache2 inactive disabled
โ mysql active enabled
โ ssh active enabled
โ my-app failed enabled
... (limitรฉ ร 30 services)
Running: 45 Failed: 1