Skip to content

Instantly share code, notes, and snippets.

@s0kil
Last active November 5, 2025 16:30
Show Gist options
  • Select an option

  • Save s0kil/6b1db453cfac58858e1c38c6caaed558 to your computer and use it in GitHub Desktop.

Select an option

Save s0kil/6b1db453cfac58858e1c38c6caaed558 to your computer and use it in GitHub Desktop.
questdb + graalvm
#!/bin/bash
# QuestDB startup script using GraalVM
# Configuration - adjust these paths as needed
GRAALVM_DIR="$HOME/graalvm/graalvm-community-openjdk-25.0.1+8.1"
QUESTDB_JAR="$HOME/questdb/questdb-9.1.1-no-jre-bin/questdb.jar"
QUESTDB_ROOT="$HOME/.questdb"
# Derived paths
JAVA_BIN="$GRAALVM_DIR/bin/java"
PID_FILE="$QUESTDB_ROOT/questdb.pid"
LOG_FILE="$QUESTDB_ROOT/questdb.log"
start() {
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if ps -p $PID > /dev/null 2>&1; then
echo "QuestDB is already running (PID: $PID)"
return 1
else
echo "Removing stale PID file"
rm -f "$PID_FILE"
fi
fi
# Verify Java exists
if [ ! -f "$JAVA_BIN" ]; then
echo "Error: GraalVM not found at $JAVA_BIN"
exit 1
fi
# Verify QuestDB jar exists
if [ ! -f "$QUESTDB_JAR" ]; then
echo "Error: QuestDB jar not found at $QUESTDB_JAR"
exit 1
fi
# Set file limits - both hard and soft
echo "Setting file limits..."
ulimit -H -n 1048576 2>/dev/null || ulimit -H -n $(ulimit -Hn)
ulimit -S -n 1048576 2>/dev/null || ulimit -S -n $(ulimit -Hn)
echo "Hard limit: $(ulimit -Hn)"
echo "Soft limit: $(ulimit -Sn)"
echo "Starting QuestDB with GraalVM..."
echo "Java: $JAVA_BIN"
"$JAVA_BIN" -version
mkdir -p "$QUESTDB_ROOT"
nohup "$JAVA_BIN" \
-Djava.awt.headless=true \
-XX:+UnlockExperimentalVMOptions \
-XX:+AlwaysPreTouch \
-XX:+UseParallelGC \
-XX:ErrorFile=$QUESTDB_ROOT/db/hs_err_pid%p.log \
-Dquestdb.server.root=$QUESTDB_ROOT \
-jar "$QUESTDB_JAR" \
-d "$QUESTDB_ROOT" > "$LOG_FILE" 2>&1 &
echo $! > "$PID_FILE"
echo "QuestDB started (PID: $(cat $PID_FILE))"
echo "Logs: $LOG_FILE"
}
stop() {
if [ ! -f "$PID_FILE" ]; then
echo "QuestDB is not running (no PID file)"
return 1
fi
PID=$(cat "$PID_FILE")
if ps -p $PID > /dev/null 2>&1; then
echo "Stopping QuestDB (PID: $PID)..."
kill $PID
# Wait for process to stop
for i in {1..30}; do
if ! ps -p $PID > /dev/null 2>&1; then
echo "QuestDB stopped"
rm -f "$PID_FILE"
return 0
fi
sleep 1
done
echo "Force killing QuestDB..."
kill -9 $PID
rm -f "$PID_FILE"
else
echo "QuestDB is not running (stale PID file)"
rm -f "$PID_FILE"
fi
}
status() {
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if ps -p $PID > /dev/null 2>&1; then
echo "QuestDB is running (PID: $PID)"
return 0
else
echo "QuestDB is not running (stale PID file)"
return 1
fi
else
echo "QuestDB is not running"
return 1
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 2
start
;;
status)
status
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment