#!/bin/sh ### BEGIN INIT INFO # Provides: clickhouse-server # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Required-Start: $network # Required-Stop: $network # Short-Description: Yandex clickhouse-server daemon ### END INIT INFO CLICKHOUSE_USER=clickhouse CLICKHOUSE_GROUP=${CLICKHOUSE_USER} SHELL=/bin/bash PROGRAM=clickhouse-server CLICKHOUSE_GENERIC_PROGRAM=clickhouse CLICKHOUSE_PROGRAM_ENV="" EXTRACT_FROM_CONFIG=${CLICKHOUSE_GENERIC_PROGRAM}-extract-from-config CLICKHOUSE_CONFDIR=/etc/$PROGRAM CLICKHOUSE_LOGDIR=/var/log/clickhouse-server CLICKHOUSE_LOGDIR_USER=root CLICKHOUSE_DATADIR=/var/lib/clickhouse if [ -d "/var/lock" ]; then LOCALSTATEDIR=/var/lock else LOCALSTATEDIR=/run/lock fi if [ ! -d "$LOCALSTATEDIR" ]; then mkdir -p "$LOCALSTATEDIR" fi CLICKHOUSE_BINDIR=/usr/bin CLICKHOUSE_CRONFILE=/etc/cron.d/clickhouse-server CLICKHOUSE_CONFIG=$CLICKHOUSE_CONFDIR/config.xml LOCKFILE=$LOCALSTATEDIR/$PROGRAM CLICKHOUSE_PIDDIR=/var/run/$PROGRAM CLICKHOUSE_PIDFILE="$CLICKHOUSE_PIDDIR/$PROGRAM.pid" # CLICKHOUSE_STOP_TIMEOUT=60 # Disabled by default. Place to /etc/default/clickhouse if you need. # Some systems lack "flock" command -v flock >/dev/null && FLOCK=flock # Override defaults from optional config file test -f /etc/default/clickhouse && . /etc/default/clickhouse # On x86_64, check for required instruction set. if uname -mpi | grep -q 'x86_64'; then if ! grep -q 'sse4_2' /proc/cpuinfo; then # On KVM, cpuinfo could falsely not report SSE 4.2 support, so skip the check. if ! grep -q 'Common KVM processor' /proc/cpuinfo; then # Some other VMs also report wrong flags in cpuinfo. # Tricky way to test for instruction set: # create temporary binary and run it; # if it get caught illegal instruction signal, # then required instruction set is not supported really. # # Generated this way: # gcc -xc -Os -static -nostdlib - <<< 'void _start() { __asm__("pcmpgtq %%xmm0, %%xmm1; mov $0x3c, %%rax; xor %%rdi, %%rdi; syscall":::"memory"); }' && strip -R .note.gnu.build-id -R .comment -R .eh_frame -s ./a.out && gzip -c -9 ./a.out | base64 -w0; echo if ! (echo -n 'H4sICAwAW1cCA2Eub3V0AKt39XFjYmRkgAEmBjsGEI+H0QHMd4CKGyCUAMUsGJiBJDNQNUiYlQEZOKDQclB9cnD9CmCSBYqJBRxQOvBpSQobGfqIAWn8FuYnPI4fsAGyPQz/87MeZtArziguKSpJTGLQK0mtKGGgGHADMSgoYH6AhTMPNHyE0NQzYuEzYzEXFr6CBPQDANAsXKTwAQAA' | base64 -d | gzip -d > /tmp/clickhouse_test_sse42 && chmod a+x /tmp/clickhouse_test_sse42 && /tmp/clickhouse_test_sse42); then echo 'Warning! SSE 4.2 instruction set is not supported' #exit 3 fi fi fi fi die() { echo $1 >&2 exit 1 } # Check that configuration file is Ok. check_config() { if [ -x "$CLICKHOUSE_BINDIR/$EXTRACT_FROM_CONFIG" ]; then su -s $SHELL ${CLICKHOUSE_USER} -c "$CLICKHOUSE_BINDIR/$EXTRACT_FROM_CONFIG --config-file=\"$CLICKHOUSE_CONFIG\" --key=path" >/dev/null || die "Configuration file ${CLICKHOUSE_CONFIG} doesn't parse successfully. Won't restart server. You may use forcerestart if you are sure."; fi } initdb() { ${CLICKHOUSE_GENERIC_PROGRAM} install --user "${CLICKHOUSE_USER}" --pid-path "${CLICKHOUSE_PIDDIR}" --config-path "${CLICKHOUSE_CONFDIR}" --binary-path "${CLICKHOUSE_BINDIR}" } start() { ${CLICKHOUSE_GENERIC_PROGRAM} start --user "${CLICKHOUSE_USER}" --pid-path "${CLICKHOUSE_PIDDIR}" --config-path "${CLICKHOUSE_CONFDIR}" --binary-path "${CLICKHOUSE_BINDIR}" } stop() { ${CLICKHOUSE_GENERIC_PROGRAM} stop --pid-path "${CLICKHOUSE_PIDDIR}" } restart() { ${CLICKHOUSE_GENERIC_PROGRAM} restart --user "${CLICKHOUSE_USER}" --pid-path "${CLICKHOUSE_PIDDIR}" --config-path "${CLICKHOUSE_CONFDIR}" --binary-path "${CLICKHOUSE_BINDIR}" } forcestop() { ${CLICKHOUSE_GENERIC_PROGRAM} stop --force --pid-path "${CLICKHOUSE_PIDDIR}" } service_or_func() { if [ -x "/bin/systemctl" ] && [ -f /etc/systemd/system/clickhouse-server.service ] && [ -d /run/systemd/system ]; then service $PROGRAM $1 else $1 fi } forcerestart() { forcestop # Should not use 'start' function if systemd active service_or_func start } use_cron() { # 1. running systemd if [ -x "/bin/systemctl" ] && [ -f /etc/systemd/system/clickhouse-server.service ] && [ -d /run/systemd/system ]; then return 1 fi # 2. disabled by config if [ -z "$CLICKHOUSE_CRONFILE" ]; then return 2 fi return 0 } # returns false if cron disabled (with systemd) enable_cron() { use_cron && sed -i 's/^#*//' "$CLICKHOUSE_CRONFILE" } # returns false if cron disabled (with systemd) disable_cron() { use_cron && sed -i 's/^#*/#/' "$CLICKHOUSE_CRONFILE" } is_cron_disabled() { use_cron || return 0 # Assumes that either no lines are commented or all lines are commented. # Also please note, that currently cron file for ClickHouse has only one line (but some time ago there was more). grep -q -E '^#' "$CLICKHOUSE_CRONFILE"; } main() { # See how we were called. EXIT_STATUS=0 case "$1" in start) service_or_func start && enable_cron ;; stop) disable_cron service_or_func stop ;; restart) service_or_func restart && enable_cron ;; forcestop) disable_cron forcestop ;; forcerestart) forcerestart && enable_cron ;; reload) service_or_func restart ;; condstart) service_or_func start ;; condstop) service_or_func stop ;; condrestart) service_or_func restart ;; condreload) service_or_func restart ;; initdb) initdb ;; enable_cron) enable_cron ;; disable_cron) disable_cron ;; *) echo "Usage: $0 {start|stop|status|restart|forcestop|forcerestart|reload|condstart|condstop|condrestart|condreload|initdb}" exit 2 ;; esac exit $EXIT_STATUS } status() { ${CLICKHOUSE_GENERIC_PROGRAM} status --pid-path "${CLICKHOUSE_PIDDIR}" } # Running commands without need of locking case "$1" in status) status ;; esac ( if $FLOCK -n 9; then main "$@" else echo "Init script is already running" && exit 1 fi ) 9> $LOCKFILE