claude-home/development/service-management.md
Cal Corum 10c9e0d854 CLAUDE: Migrate to technology-first documentation architecture
Complete restructure from patterns/examples/reference to technology-focused directories:

• Created technology-specific directories with comprehensive documentation:
  - /tdarr/ - Transcoding automation with gaming-aware scheduling
  - /docker/ - Container management with GPU acceleration patterns
  - /vm-management/ - Virtual machine automation and cloud-init
  - /networking/ - SSH infrastructure, reverse proxy, and security
  - /monitoring/ - System health checks and Discord notifications
  - /databases/ - Database patterns and troubleshooting
  - /development/ - Programming language patterns (bash, nodejs, python, vuejs)

• Enhanced CLAUDE.md with intelligent context loading:
  - Technology-first loading rules for automatic context provision
  - Troubleshooting keyword triggers for emergency scenarios
  - Documentation maintenance protocols with automated reminders
  - Context window management for optimal documentation updates

• Preserved valuable content from .claude/tmp/:
  - SSH security improvements and server inventory
  - Tdarr CIFS troubleshooting and Docker iptables solutions
  - Operational scripts with proper technology classification

• Benefits achieved:
  - Self-contained technology directories with complete context
  - Automatic loading of relevant documentation based on keywords
  - Emergency-ready troubleshooting with comprehensive guides
  - Scalable structure for future technology additions
  - Eliminated context bloat through targeted loading

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-12 23:20:15 -05:00

2.9 KiB

Bash Service Management Examples

Systemd Service Script

#!/bin/bash
set -euo pipefail

SERVICE_NAME="myapp"
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"

usage() {
    echo "Usage: $0 {install|start|stop|restart|status|logs|uninstall}"
    exit 1
}

install_service() {
    echo "Installing ${SERVICE_NAME} service..."
    
    sudo tee "$SERVICE_FILE" > /dev/null << EOF
[Unit]
Description=My Application Service
After=network.target
Wants=network.target

[Service]
Type=simple
User=myapp
Group=myapp
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/myapp
Restart=always
RestartSec=10
Environment=NODE_ENV=production

[Install]
WantedBy=multi-user.target
EOF

    sudo systemctl daemon-reload
    sudo systemctl enable "$SERVICE_NAME"
    echo "Service installed and enabled"
}

manage_service() {
    local action="$1"
    echo "${action^}ing ${SERVICE_NAME} service..."
    sudo systemctl "$action" "$SERVICE_NAME"
    echo "Service ${action}ed successfully"
}

show_status() {
    echo "=== Service Status ==="
    sudo systemctl status "$SERVICE_NAME" --no-pager -l
    echo
    echo "=== Service Logs (last 20 lines) ==="
    sudo journalctl -u "$SERVICE_NAME" --no-pager -n 20
}

show_logs() {
    echo "Following logs for ${SERVICE_NAME}..."
    sudo journalctl -u "$SERVICE_NAME" -f
}

uninstall_service() {
    echo "Uninstalling ${SERVICE_NAME} service..."
    sudo systemctl stop "$SERVICE_NAME" || true
    sudo systemctl disable "$SERVICE_NAME" || true
    sudo rm -f "$SERVICE_FILE"
    sudo systemctl daemon-reload
    echo "Service uninstalled"
}

case "${1:-}" in
    install)
        install_service
        ;;
    start|stop|restart)
        manage_service "$1"
        ;;
    status)
        show_status
        ;;
    logs)
        show_logs
        ;;
    uninstall)
        uninstall_service
        ;;
    *)
        usage
        ;;
esac

Process Monitoring Script

#!/bin/bash
set -euo pipefail

PROCESS_NAME="myapp"
RESTART_COMMAND="/opt/myapp/start.sh"
LOG_FILE="/var/log/myapp-monitor.log"
PID_FILE="/var/run/myapp.pid"

log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}

check_process() {
    if [[ -f "$PID_FILE" ]]; then
        local pid=$(cat "$PID_FILE")
        if kill -0 "$pid" 2>/dev/null; then
            return 0  # Process is running
        else
            rm -f "$PID_FILE"
            return 1  # Process is not running
        fi
    else
        return 1  # PID file doesn't exist
    fi
}

restart_process() {
    log_message "Attempting to restart $PROCESS_NAME..."
    if $RESTART_COMMAND; then
        log_message "$PROCESS_NAME restarted successfully"
    else
        log_message "Failed to restart $PROCESS_NAME"
        exit 1
    fi
}

main() {
    if ! check_process; then
        log_message "$PROCESS_NAME is not running"
        restart_process
    else
        log_message "$PROCESS_NAME is running normally"
    fi
}

main "$@"