147 lines
3.8 KiB
Bash
Executable File
147 lines
3.8 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e
|
|
|
|
source /etc/profile
|
|
export JAVA_HOME=/usr/java/latest
|
|
export PATH=$JAVA_HOME/bin:$PATH
|
|
touch /tmp/start.log
|
|
chown admin: /tmp/start.log
|
|
chown -R admin: /home/admin/canal-server
|
|
host=`hostname -i`
|
|
|
|
# waitterm
|
|
# wait TERM/INT signal.
|
|
# see: http://veithen.github.io/2014/11/16/sigterm-propagation.html
|
|
waitterm() {
|
|
local PID
|
|
# any process to block
|
|
tail -f /dev/null &
|
|
PID="$!"
|
|
# setup trap, could do nothing, or just kill the blocker
|
|
trap "kill -TERM ${PID}" TERM INT
|
|
# wait for signal, ignore wait exit code
|
|
wait "${PID}" || true
|
|
# clear trap
|
|
trap - TERM INT
|
|
# wait blocker, ignore blocker exit code
|
|
wait "${PID}" 2>/dev/null || true
|
|
}
|
|
|
|
# waittermpid "${PIDFILE}".
|
|
# monitor process by pidfile && wait TERM/INT signal.
|
|
# if the process disappeared, return 1, means exit with ERROR.
|
|
# if TERM or INT signal received, return 0, means OK to exit.
|
|
waittermpid() {
|
|
local PIDFILE PID do_run error
|
|
PIDFILE="${1?}"
|
|
do_run=true
|
|
error=0
|
|
trap "do_run=false" TERM INT
|
|
while "${do_run}" ; do
|
|
PID="$(cat "${PIDFILE}")"
|
|
if ! ps -p "${PID}" >/dev/null 2>&1 ; then
|
|
do_run=false
|
|
error=1
|
|
else
|
|
sleep 1
|
|
fi
|
|
done
|
|
trap - TERM INT
|
|
return "${error}"
|
|
}
|
|
|
|
|
|
function checkStart() {
|
|
local name=$1
|
|
local cmd=$2
|
|
local timeout=$3
|
|
cost=5
|
|
while [ $timeout -gt 0 ]; do
|
|
ST=`eval $cmd`
|
|
if [ "$ST" == "0" ]; then
|
|
sleep 1
|
|
let timeout=timeout-1
|
|
let cost=cost+1
|
|
elif [ "$ST" == "" ]; then
|
|
sleep 1
|
|
let timeout=timeout-1
|
|
let cost=cost+1
|
|
else
|
|
break
|
|
fi
|
|
done
|
|
echo "start $name successful"
|
|
}
|
|
|
|
|
|
function start_canal() {
|
|
echo "start canal ..."
|
|
managerAddress=`perl -le 'print $ENV{"canal.admin.manager"}'`
|
|
if [ ! -z "$managerAddress" ] ; then
|
|
# canal_local.properties mode
|
|
adminPort=`perl -le 'print $ENV{"canal.admin.port"}'`
|
|
if [ -z "$adminPort" ] ; then
|
|
adminPort=11110
|
|
fi
|
|
|
|
su admin -c 'cd /home/admin/canal-server/bin/ && sh restart.sh local 1>>/tmp/start.log 2>&1'
|
|
sleep 5
|
|
#check start
|
|
checkStart "canal" "nc 127.0.0.1 $adminPort -w 1 -z | wc -l" 30
|
|
else
|
|
metricsPort=`perl -le 'print $ENV{"canal.metrics.pull.port"}'`
|
|
if [ -z "$metricsPort" ] ; then
|
|
metricsPort=11112
|
|
fi
|
|
|
|
destination=`perl -le 'print $ENV{"canal.destinations"}'`
|
|
if [[ "$destination" =~ ',' ]]; then
|
|
echo "multi destination:$destination is not support"
|
|
exit 1;
|
|
else
|
|
if [ "$destination" != "" ] && [ "$destination" != "example" ] ; then
|
|
if [ -d /home/admin/canal-server/conf/example ]; then
|
|
mv /home/admin/canal-server/conf/example /home/admin/canal-server/conf/$destination
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
su admin -c 'cd /home/admin/canal-server/bin/ && sh restart.sh 1>>/tmp/start.log 2>&1'
|
|
sleep 5
|
|
#check start
|
|
checkStart "canal" "nc 127.0.0.1 $metricsPort -w 1 -z | wc -l" 30
|
|
fi
|
|
}
|
|
|
|
function stop_canal() {
|
|
echo "stop canal"
|
|
su admin -c 'cd /home/admin/canal-server/bin/ && sh stop.sh 1>>/tmp/start.log 2>&1'
|
|
echo "stop canal successful ..."
|
|
}
|
|
|
|
function start_exporter() {
|
|
su admin -c 'cd /home/admin/node_exporter && ./node_exporter 1>>/tmp/start.log 2>&1 &'
|
|
}
|
|
|
|
function stop_exporter() {
|
|
su admin -c 'killall node_exporter'
|
|
}
|
|
|
|
echo "==> START ..."
|
|
|
|
start_exporter
|
|
start_canal
|
|
|
|
echo "==> START SUCCESSFUL ..."
|
|
|
|
tail -f /dev/null &
|
|
# wait TERM signal
|
|
waitterm
|
|
|
|
echo "==> STOP"
|
|
|
|
stop_canal
|
|
stop_exporter
|
|
|
|
echo "==> STOP SUCCESSFUL ..."
|