1#!/usr/bin/env bash
2set -euo pipefail
3
4declare -A SERVICES
5LOG_DIR="/var/log/svcmanager"
6
7init_service() {
8 local name="$1"
9 local command="$2"
10 SERVICES["$name"]="stopped"
11 mkdir -p "${LOG_DIR}"
12}
13
14start_service() {
15 local name="$1"
16 local command="$2"
17 if [[ "${SERVICES[$name]:-}" == "running" ]]; then
18 printf "Service %s is already running\n" "$name"
19 return 1
20 fi
21 nohup $command > "${LOG_DIR}/${name}.log" 2>&1 &
22 local pid=$!
23 SERVICES["$name"]="running"
24 printf "%d" "$pid" > "${LOG_DIR}/${name}.pid"
25 printf "Started %s with PID %d\n" "$name" "$pid"
26}
27
28stop_service() {
29 local name="$1"
30 local pidfile="${LOG_DIR}/${name}.pid"
31 if [[ ! -f "$pidfile" ]]; then
32 printf "No PID file for %s\n" "$name"
33 return 1
34 fi
35 local pid
36 pid=$(< "$pidfile")
37 if kill -0 "$pid" 2>/dev/null; then
38 kill -TERM "$pid"
39 local count=0
40 while kill -0 "$pid" 2>/dev/null; do
41 sleep 1
42 (( count++ ))
43 if (( count >= 10 )); then
44 kill -9 "$pid"
45 break
46 fi
47 done
48 fi
49 rm -f "$pidfile"
50 SERVICES["$name"]="stopped"
51 printf "Stopped %s\n" "$name"
52}
53
54list_services() {
55 printf "%-20s %s\n" "SERVICE" "STATUS"
56 printf "%-20s %s\n" "-------" "------"
57 for name in "${!SERVICES[@]}"; do
58 printf "%-20s %s\n" "$name" "${SERVICES[$name]}"
59 done
60}
61
62health_check() {
63 local failures=0
64 for name in "${!SERVICES[@]}"; do
65 local pidfile="${LOG_DIR}/${name}.pid"
66 if [[ "${SERVICES[$name]}" == "running" ]]; then
67 if [[ -f "$pidfile" ]]; then
68 local pid
69 pid=$(< "$pidfile")
70 if ! kill -0 "$pid" 2>/dev/null; then
71 SERVICES["$name"]="crashed"
72 (( failures++ ))
73 fi
74 fi
75 fi
76 done
77 return "$failures"
78}