Files
honoka-chan/run.sh
T
2026-06-04 03:20:24 +08:00

136 lines
2.4 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
APP_BIN="$ROOT_DIR/honoka-chan"
PID_FILE="$ROOT_DIR/temp/run/honoka-chan.pid"
LOG_FILE="$ROOT_DIR/temp/run/honoka-chan.log"
mkdir -p "$(dirname "$PID_FILE")"
build_app() {
if command -v go >/dev/null 2>&1; then
(cd "$ROOT_DIR" && go build -o honoka-chan main.go)
else
echo "Go is not installed, cannot build honoka-chan automatically"
exit 1
fi
}
is_running() {
[[ -f "$PID_FILE" ]] || return 1
local pid
pid="$(cat "$PID_FILE" 2>/dev/null || true)"
[[ -n "${pid:-}" ]] || return 1
kill -0 "$pid" 2>/dev/null || return 1
local args
args="$(ps -p "$pid" -o args= 2>/dev/null || true)"
[[ "$args" == *"$APP_BIN"* || "$args" == *"honoka-chan"* ]]
}
start_app() {
if is_running; then
echo "honoka-chan is already running, pid=$(cat "$PID_FILE")"
return 0
fi
if [[ ! -f "$APP_BIN" ]]; then
build_app
fi
if [[ ! -x "$APP_BIN" ]]; then
echo "honoka-chan binary is not executable: $APP_BIN"
exit 1
fi
nohup "$APP_BIN" >"$LOG_FILE" 2>&1 &
local pid=$!
echo "$pid" >"$PID_FILE"
sleep 1
if kill -0 "$pid" 2>/dev/null; then
echo "honoka-chan started successfully, pid=$pid"
else
rm -f "$PID_FILE"
echo "honoka-chan failed to start, check $LOG_FILE"
exit 1
fi
}
stop_app() {
if ! is_running; then
rm -f "$PID_FILE"
echo "honoka-chan is not running"
return 0
fi
local pid
pid="$(cat "$PID_FILE")"
kill "$pid" 2>/dev/null || true
for _ in $(seq 1 50); do
if ! kill -0 "$pid" 2>/dev/null; then
rm -f "$PID_FILE"
echo "honoka-chan stopped"
return 0
fi
sleep 0.2
done
kill -9 "$pid" 2>/dev/null || true
rm -f "$PID_FILE"
echo "honoka-chan force stopped"
}
status_app() {
if is_running; then
echo "honoka-chan is running, pid=$(cat "$PID_FILE")"
else
echo "honoka-chan is not running"
fi
}
logs_app() {
touch "$LOG_FILE"
tail -f "$LOG_FILE"
}
usage() {
cat <<'EOF'
Usage:
./run.sh start Start service
./run.sh stop Stop service
./run.sh restart Restart service
./run.sh status Check status
./run.sh logs Follow logs
EOF
}
case "${1:-}" in
start)
start_app
;;
stop)
stop_app
;;
restart)
stop_app
start_app
;;
status)
status_app
;;
logs)
logs_app
;;
""|-h|--help|help)
usage
;;
*)
echo "Unknown command: $1"
usage
exit 1
;;
esac