Add daemon control script

Signed-off-by: Sean Du <do4suki@gmail.com>
This commit is contained in:
2026-06-01 21:48:41 +08:00
parent 897851a2eb
commit 5ccde3f34a
2 changed files with 143 additions and 0 deletions
Executable
+127
View File
@@ -0,0 +1,127 @@
#!/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
build_app
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