ClickHouse/tools/init.d/template

267 lines
4.9 KiB
Plaintext
Raw Normal View History

#! /bin/sh
### BEGIN INIT INFO
# Provides: @DAEMON@
# Default-Start: 2
# Default-Stop: 1
# Short-Description: Yandex daemon
### END INIT INFO
USER=metrika
GROUP=metrika
SHELL=/bin/sh
PROGRAM=@DAEMON@
SYSCONFDIR=/etc/$PROGRAM
LOGDIR=/var/log/$PROGRAM
LOCALSTATEDIR=/var/lock
BINDIR=/usr/bin
CRONFILE=/etc/cron.d/@CRONFILE@
CNFFILE=$SYSCONFDIR/config.xml
LOCKFILE=$LOCALSTATEDIR/$PROGRAM
RETVAL=0
DEFAULT_NUMBER_OF_PROCESSES=1
NUMBER_OF_PROCESSES=$DEFAULT_NUMBER_OF_PROCESSES
LOG_FILE=""
# С помощью xmlstarlet пытаемся взять некоторые параметры из конфига
if command -v xmlstarlet >/dev/null 2>&1; then
NUMBER_OF_PROCESSES=$(xmlstarlet sel -t -v "/yandex/number_of_processes" $CNFFILE || echo $DEFAULT_NUMBER_OF_PROCESSES)
LOG_FILE=$(xmlstarlet sel -t -v "/yandex/logger/log" $CNFFILE || echo $LOG_FILE)
fi
PIDDIR=/var/run/$PROGRAM
PIDFILE_PREFIX=$PIDDIR/$PROGRAM
2014-12-01 17:31:44 +00:00
PIDFILE_RE="$PIDFILE_PREFIX[0-9]*.pid"
2014-12-03 12:09:00 +00:00
generate_program_name()
{
if [ $NUMBER_OF_PROCESSES -eq 1 ]; then
echo $PROGRAM
else
echo $PROGRAM$1
fi
}
generate_pid_name()
{
echo $PIDFILE_PREFIX$1.pid
}
specific_log_file_for_each_process()
{
# Не будем менять имя лог файла, при одном процессе
# Не выставляем, если имя лог файла пустое
if [ $NUMBER_OF_PROCESSES -gt 1 ] && [ "$LOG_FILE" != "" ]; then
log_file=$(echo $LOG_FILE | sed "s/\.log/$1.log/")
echo "--log-file=\"$log_file\""
fi
echo ""
}
find_pid_files()
{
2014-12-03 11:15:29 +00:00
find $PIDDIR -regex "$PIDFILE_RE"
}
is_running()
{
pidfile=$1
[ -r "$pidfile" ] && pgrep -s $(cat "$pidfile") 1> /dev/null 2> /dev/null
}
running_processes()
{
pidfiles=$(find_pid_files)
running=0
for pidfile in $pidfiles; do
if is_running $pidfile; then
running=$(($running + 1))
fi
done
echo $running
}
any_runs()
{
if [[ $(running_processes) -gt 0 ]]; then return 0; else return 1; fi
}
wait4done()
{
while any_runs; do
sleep 1
done
}
start()
{
[ -x $BINDIR/$PROGRAM ] || exit 0
local EXIT_STATUS
EXIT_STATUS=0
echo -n "Start $PROGRAM service: "
[ -f "$LOCKFILE" ] && sleep 1
if [[ $(running_processes) -eq $NUMBER_OF_PROCESSES ]]; then
echo -n "already running "
EXIT_STATUS=1
else
# Clean stale lock files
rm -f "$LOCKFILE"
mkdir -p $LOGDIR
mkdir -p $PIDDIR
chown -R $USER:$GROUP $LOGDIR
chown -R $USER:$GROUP $PIDDIR
chown -R $USER:$GROUP $SYSCONFDIR
for i in $(seq 1 $NUMBER_OF_PROCESSES); do
if ! is_running $(generate_pid_name $i); then
rm -f $(generate_pid_name $i)
# TODO может лучше передавать демону номер процесса, а демон сам будет делать все необходимые подстановки
su -l $USER -s $SHELL -c "exec -a $(generate_program_name $i) \"$BINDIR/$PROGRAM\" --daemon --pid-file=\"$(generate_pid_name $i)\" --config-file=\"$CNFFILE\" $(specific_log_file_for_each_process $i)"
EXIT_STATUS=$?
if [[ $EXIT_STATUS -ne 0 ]]; then
break
fi
fi
done
fi
if [[ $EXIT_STATUS -eq 0 ]]; then
touch "$LOCKFILE"
echo "DONE"
else
echo "FAILED"
fi
return $EXIT_STATUS
}
stop()
{
local EXIT_STATUS
EXIT_STATUS=0
echo -n "Stop $PROGRAM service: "
if any_runs; then
if [ -f "$LOCKFILE" ]; then
for pid_file in $(find_pid_files); do
kill -TERM `cat "$pid_file"`
done
wait4done
rm -f "$LOCKFILE"
else
echo "has been stopping already"
return 1
fi
2010-08-02 17:29:22 +00:00
else
rm -f "$LOCKFILE"
fi
echo "DONE"
return $EXIT_STATUS
}
restart()
{
stop
start
}
2010-03-09 19:01:07 +00:00
forcestop()
{
local EXIT_STATUS
EXIT_STATUS=0
echo -n "Stop $PROGRAM service: "
if any_runs; then
2010-03-09 19:01:07 +00:00
if [ -f "$LOCKFILE" ]; then
for pid_file in $(find_pid_files); do
kill -9 `cat "$pid_file"`
done
wait4done
2014-12-01 18:03:47 +00:00
rm -f "$LOCKFILE"
2010-03-09 19:01:07 +00:00
else
echo "has been stopping already"
return 1
2010-03-09 19:01:07 +00:00
fi
fi
echo "DONE"
return $EXIT_STATUS
}
forcerestart()
{
forcestop
start
}
enable_cron()
{
sed -i 's/^#*//' "$CRONFILE"
}
disable_cron()
{
sed -i 's/^#*/#/' "$CRONFILE"
}
# See how we were called.
EXIT_STATUS=0
case "$1" in
start)
start && enable_cron
;;
stop)
disable_cron && stop
;;
status)
if [[ $(running_processes) -eq $NUMBER_OF_PROCESSES ]]; then
echo "$PROGRAM service is running"
else
if [ ! -e $LOCKFILE ]; then
echo "$PROGRAM service is stopped";
else
2014-12-01 18:03:47 +00:00
echo "$PROGRAM: $(($NUMBER_OF_PROCESSES - $(running_processes))) of $NUMBER_OF_PROCESSES processes unexpectedly terminated"
fi
fi
;;
restart)
restart && enable_cron
;;
2010-03-09 19:01:07 +00:00
forcestop)
disable_cron && forcestop
;;
forcerestart)
forcerestart && enable_cron
;;
reload)
restart
;;
condstart)
any_runs || start
;;
condstop)
any_runs && stop
;;
condrestart)
any_runs && restart
;;
condreload)
any_runs && restart
;;
*)
echo "Usage: ${0##*/} {start|stop|status|restart|forcestop|forcerestart|reload|condstart|condstop|condrestart|condreload}"
EXIT_STATUS=2
esac
exit $EXIT_STATUS