github.com/klaytn/klaytn@v1.10.2/build/packaging/linux/bin/kbnd (about) 1 #!/usr/bin/env bash 2 3 BIN=$(cd "$(dirname $0)"; pwd) 4 CMD_HOME=$(dirname $BIN) 5 CONF=$CMD_HOME/conf 6 STOP_TIMEOUT=10 # seconds to wait for a clean exit 7 8 source $CONF/kbnd.conf 9 10 pidfile=$CMD_HOME/kbnd.pid 11 auto_restart_daemon_pidfile=$DATA_DIR/restart_daemon_kbnd.pid 12 13 __pid_run() { 14 unset pid 15 if [ ! -f $pidfile ]; then 16 return 17 fi 18 PID_NUM=$(cat $pidfile) 19 if [[ ! -z "$PID_NUM" ]]; then 20 export pid=$(ps -p $PID_NUM -o pid=) 21 fi 22 } 23 24 __auto_restart_daemon_pid_run() { 25 unset auto_restart_daemon_pid 26 if [ ! -f $auto_restart_daemon_pidfile ]; then 27 return 28 fi 29 AUTO_RESTART_DAEMON_PID_NUM=$(cat $auto_restart_daemon_pidfile) 30 if [[ ! -z "$AUTO_RESTART_DAEMON_PID_NUM" ]]; then 31 export auto_restart_daemon_pid=$(ps -p $AUTO_RESTART_DAEMON_PID_NUM -o pid=) 32 fi 33 } 34 35 __kill_timeout() { 36 local PIDNUM=$1 37 kill $PIDNUM 38 for i in `seq 0 100 $((1000 * $STOP_TIMEOUT))`; do 39 if ! kill -0 $PIDNUM 2> /dev/null; then 40 echo "OK" 41 return 42 fi 43 sleep 0.1 44 done 45 kill -9 $PIDNUM && echo "Killed" 46 } 47 48 #------------------------Related Auto restart daemon functions----------------------------- 49 __auto_restart_daemon() { 50 local backOffTime=$AUTO_RESTART_INTERVAL 51 local coeff=2 52 while : 53 do 54 sleep 1 55 __pid_run 56 if [ -z "$pid" ]; then 57 echo "INFO[`date`] node[${PID_NUM}] is down" 58 if [ -f $pidfile ]; then 59 echo "INFO[`date`] remove redundant pid file" 60 rm -f ${pidfile} 61 fi 62 echo "INFO[`date`] Sleep for backOffTime.... ${backOffTime} seconds." 63 sleep $backOffTime 64 echo -n "INFO[`date`] " 65 start_node 66 backOffTime=$(echo $backOffTime $coeff | awk '{printf "%.1f\n",$1*$2}') 67 68 echo "INFO[`date`] backOffTime = ${backOffTime}, Restarted node pid = ${PID_NUM}" 69 PID_NUM=$(cat $pidfile) 70 echo "" 71 fi 72 done 73 } 74 75 start_auto_restart_daemon() { 76 __auto_restart_daemon_pid_run 77 if [ -z $auto_restart_daemon_pid ]; then 78 __auto_restart_daemon >> ${LOG_DIR}/restart_daemon.out 2>&1 & 79 disown 80 AUTO_RESTART_DAEMON_PID_NUM=$! 81 AUTO_RESTART_DAEMON_RETVAL=$? 82 83 set +f 84 if [ $AUTO_RESTART_DAEMON_RETVAL = 0 ]; then 85 echo $AUTO_RESTART_DAEMON_PID_NUM > ${auto_restart_daemon_pidfile} 86 echo "Success to start auto restart daemon." 87 else 88 echo "Fail to start auto restart daemon." 89 fi 90 fi 91 } 92 93 stop_auto_restart_daemon() { 94 __auto_restart_daemon_pid_run 95 [ -z "$auto_restart_daemon_pid" ] && echo "auto restart daemon is not running" && return 96 echo -n "Shutting down auto restart daemon: " 97 __kill_timeout $(cat ${auto_restart_daemon_pidfile}) && rm -f ${auto_restart_daemon_pidfile} 98 } 99 100 status_auto_restart_daemon() { 101 __auto_restart_daemon_pid_run 102 if [ -n "$auto_restart_daemon_pid" ]; then 103 echo "auto restart daemon is running." 104 else 105 echo "auto restart daemon is down." 106 fi 107 } 108 109 #------------------------Related to Klaytn node functions----------------------------- 110 111 __check_option() { 112 if [ ! -d $LOG_DIR ]; then 113 mkdir -p $LOG_DIR 114 fi 115 116 if [ ! -d $DATA_DIR ]; then 117 mkdir -p $DATA_DIR 118 fi 119 120 set -f 121 OPTIONS="--nodekey ${KEY_PATH}" 122 if [[ ! -z $NETWORK_ID ]] && [[ $NETWORK_ID != "" ]]; then 123 OPTIONS="$OPTIONS --networkid $NETWORK_ID" 124 fi 125 126 if [[ ! -z $METRICS ]] && [[ $METRICS -eq 1 ]]; then 127 OPTIONS="$OPTIONS --metrics" 128 fi 129 130 if [[ ! -z $PROMETHEUS ]] && [[ $PROMETHEUS -eq 1 ]]; then 131 OPTIONS="$OPTIONS --prometheus" 132 fi 133 134 if [[ ! -z $AUTHORIZED_NODES ]] && [[ $AUTHORIZED_NODES != "" ]]; then 135 OPTIONS="$OPTIONS --authorized-nodes $AUTHORIZED_NODES" 136 fi 137 138 if [[ ! -z $ADDITIONAL ]] && [[ $ADDITIONAL != "" ]]; then 139 OPTIONS="$OPTIONS $ADDITIONAL" 140 fi 141 142 if [ ! -z $DATA_DIR ]; then 143 OPTIONS="$OPTIONS --datadir $DATA_DIR" 144 fi 145 } 146 147 start_node() { 148 __pid_run 149 [ -n "$pid" ] && echo "kbnd already running...[$pid]" && return 150 151 if [ ! -f $KEY_PATH ]; then 152 echo 153 echo " [ERROR] : KEY_PATH is not defined in $CONF/kbnd.conf" 154 exit 1 155 fi 156 157 echo -n "Starting kbnd: " 158 159 __check_option 160 161 $BIN/kbn ${OPTIONS} >> ${LOG_DIR}/kbnd.out 2>&1 & 162 RETVAL=$? 163 PIDNUM=$! 164 set +f 165 if [ $RETVAL = 0 ]; then 166 echo $PIDNUM > ${pidfile} 167 echo "Success to start node." 168 else 169 echo "Fail to start node." 170 fi 171 return $RETVAL 172 } 173 174 stop_node() { 175 __pid_run 176 [ -z "$pid" ] && echo "kbnd is not running" && return 177 echo -n "Shutting down kbnd: " 178 __kill_timeout $(cat ${pidfile}) && rm -f ${pidfile} 179 } 180 181 status_node() { 182 __pid_run 183 if [ -n "$pid" ]; then 184 echo "kbnd is running" 185 else 186 echo "kbnd is down" 187 fi 188 } 189 190 #--------------------- Public functions -------------------------- 191 start() { 192 if [ ! -d $LOG_DIR ]; then 193 mkdir -p $LOG_DIR 194 fi 195 196 if [ ! -z $AUTO_RESTART_NODE ] && [[ $AUTO_RESTART_NODE -eq 1 ]]; then 197 start_auto_restart_daemon 198 else 199 start_node 200 fi 201 } 202 203 start_docker() { 204 echo -n "Starting kbnd: " 205 __check_option 206 207 echo "$BIN/kbn $OPTIONS" 208 $BIN/kbn $OPTIONS 209 } 210 211 stop() { 212 if [ ! -z $AUTO_RESTART_NODE ] && [[ $AUTO_RESTART_NODE -eq 1 ]]; then 213 stop_auto_restart_daemon 214 fi 215 stop_node 216 } 217 218 219 status() { 220 status_node 221 if [ ! -z $AUTO_RESTART_NODE ] && [[ $AUTO_RESTART_NODE -eq 1 ]]; then 222 status_auto_restart_daemon 223 fi 224 } 225 226 restart() { 227 stop 228 sleep 3 229 start 230 } 231 232 case "$1" in 233 start) 234 start 235 ;; 236 start-docker) 237 start_docker 238 ;; 239 stop) 240 stop 241 ;; 242 status) 243 status 244 ;; 245 restart) 246 restart 247 ;; 248 *) 249 echo "Usages: kbnd {start|start-docker|stop|restart|status}" 250 exit 1 251 ;; 252 esac 253 exit 0