#!/usr/bin/env bash ################################################################################ # ___ _ ____ ____ # / _ \ _ _ ___ ___| |_| _ \| __ ) # | | | | | | |/ _ \/ __| __| | | | _ \ # | |_| | |_| | __/\__ \ |_| |_| | |_) | # \__\_\\__,_|\___||___/\__|____/|____/ # # Copyright (c) 2014-2019 Appsicle # Copyright (c) 2019-2023 QuestDB # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ################################################################################ export QDB_PROCESS_LABEL="QuestDB-Runtime-66535" export QDB_MAX_STOP_ATTEMPTS=5 export QDB_OS=$(uname) case $(uname) in Darwin | FreeBSD) export PS_CMD="ps aux" export QDB_DEFAULT_ROOT="/usr/local/var/questdb" ;; *) export PS_CMD="ps -ef" export QDB_DEFAULT_ROOT="/var/lib/questdb" ;; esac ## jvm java_opt configurations if [ -f "/etc/questdb/jvm.env" ]; then source "/etc/questdb/jvm.env" fi function read_link { f=$(readlink $1) if [ "$f" != "" ]; then if [[ "$f" != /* ]]; then f="$(dirname $1)/$f" f="$(cd $(dirname ${f}); pwd)/$(basename ${f})" fi n=$(read_link ${f}) if [ "$n" != "" ]; then f=${n}; fi fi echo "$f" } function usage { echo "Usage: $0 start|status|stop [-f] [-d path] [-t tag]" echo exit 55 } function export_pid { export QDB_PID=`${PS_CMD} | grep ${QDB_PROCESS_LABEL} | grep -v grep | tr -s " " | cut -d " " -f 2` } function export_java { # check if this is our runtime if [ -f "$BASE/java" ]; then export QDB_PACKAGE=withjre export JAVA="$BASE/java" else export QDB_PACKAGE=withoutjre if [ "$JAVA_HOME" = "" -a -e /usr/libexec/java_home ]; then JAVA_HOME=$(/usr/libexec/java_home -v 11) fi # check that JAVA_HOME is defined if [ "$JAVA_HOME" = "" ]; then JAVA_HOME=/usr/lib/jvm/default fi # check that Java binary is executable export JAVA=${JAVA_HOME}/bin/java fi if [ ! -x "$JAVA" ]; then echo "$JAVA is not executable" exit 55; fi echo "JAVA: $JAVA" } function export_args { export QDB_OVERWRITE_PUBLIC="" export QDB_DISABLE_HUP_HANDLER="" export QDB_CONTAINER_MODE="" export QDB_ROOT=${QDB_DEFAULT_ROOT} while [[ $# -gt 0 ]]; do key="$1" case ${key} in -f) export QDB_OVERWRITE_PUBLIC="-f" ;; -n) export QDB_DISABLE_HUP_HANDLER="-n" ;; -c) export QDB_CONTAINER_MODE="-c" ;; -d) if [[ $# -eq 1 ]]; then echo "Expected: -d " exit 55 fi export QDB_ROOT="$2" shift ;; -t) if [[ $# -eq 1 ]]; then echo "Expected: -t " exit 55 fi export QDB_PROCESS_LABEL="QuestDB-Runtime-$2" shift ;; *) echo "Unexpected option: $key" usage ;; esac shift done } function start { export_pid if [[ "${QDB_PID}" != "" ]]; then echo "Already running. PID: ${QDB_PID}" exit 55 fi # LINK=$(read_link $0) # if [ "$LINK" != "" ]; then # BASE=$(dirname ${LINK}) # else # BASE=$(dirname $0) # fi BASE=/usr/share/java/questdb export_java # create root directory if it does not exist if [ ! -d "$QDB_ROOT" ]; then echo "Created QuestDB ROOT directory: $QDB_ROOT" mkdir -p ${QDB_ROOT} fi QDB_LOG=/var/log/questdb/ mkdir -p ${QDB_LOG} JAVA_LIB="$BASE/questdb.jar" JAVA_OPTS="${JAVA_OPTS} -D$QDB_PROCESS_LABEL -ea -Dnoebug -XX:+UnlockExperimentalVMOptions -XX:+AlwaysPreTouch -XX:+UseParallelGC " JAVA_MAIN="io.questdb/io.questdb.ServerMain" DATE=`date +%Y-%m-%dT%H-%M-%S` if [ "${QDB_CONTAINER_MODE}" != "" ]; then ${JAVA} ${JAVA_OPTS} -p ${JAVA_LIB} -m ${JAVA_MAIN} -d ${QDB_ROOT} ${QDB_OVERWRITE_PUBLIC} >${QDB_LOG}/stdout-${DATE}.txt elif [ "${QDB_DISABLE_HUP_HANDLER}" = "" ]; then ${JAVA} ${JAVA_OPTS} -p ${JAVA_LIB} -m ${JAVA_MAIN} -d ${QDB_ROOT} ${QDB_OVERWRITE_PUBLIC} >${QDB_LOG}/stdout-${DATE}.txt & sleep 0.5 else ${JAVA} ${JAVA_OPTS} -p ${JAVA_LIB} -m ${JAVA_MAIN} -d ${QDB_ROOT} ${QDB_OVERWRITE_PUBLIC} ${QDB_DISABLE_HUP_HANDLER} >${QDB_LOG}/stdout-${DATE}.txt fi } function query { export_pid if [[ "${QDB_PID}" = "" ]]; then echo "Not running" else echo "PID: ${QDB_PID}" fi } function stop { export_pid if [[ "${QDB_PID}" = "" ]]; then echo "Not running" exit 55 fi OUR_PID=${QDB_PID} echo "Stopping ${OUR_PID}" count=${QDB_MAX_STOP_ATTEMPTS} while [ "${QDB_PID}" != "" ] && [ ${count} -gt 0 ]; do kill ${QDB_PID} sleep 0.5 export_pid count=$((count - 1)) done if [[ "${QDB_PID}" != "" ]]; then kill -9 ${QDB_PID} echo "Something is wrong. Process does not stop. Killing..." export_pid fi if [[ "${QDB_PID}" != "" ]]; then echo "Cannot stop ${QDB_PID}. Check permissions." else echo "Stopped ${OUR_PID}" fi } function banner { echo '' echo ' ___ _ ____ ____' echo ' / _ \ _ _ ___ ___| |_| _ \| __ )' echo '| | | | | | |/ _ \/ __| __| | | | _ \' echo '| |_| | |_| | __/\__ \ |_| |_| | |_) |' echo ' \__\_\\__,_|\___||___/\__|____/|____/' echo ' www.questdb.io' echo } banner if [[ $# -gt 0 ]]; then command=$1 shift export_args $@ case ${command} in start) start ;; status) query ;; stop) stop ;; *) usage ;; esac else usage fi