# Bash Service Management Examples ## Systemd Service Script ```bash #!/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 ```bash #!/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 "$@" ```