136 lines
2.4 KiB
Bash
Executable File
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
|