ssr-monitor 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #!/bin/sh
  2. #
  3. # Copyright (C) 2017 openwrt-ssr
  4. # Copyright (C) 2017 yushi studio <[email protected]>
  5. #
  6. # This is free software, licensed under the GNU General Public License v3.
  7. # See /LICENSE for more information.
  8. #
  9. LOCK_FILE="/var/lock/ssr-monitor.lock"
  10. [ -f "$LOCK_FILE" ] && exit 2
  11. touch "$LOCK_FILE"
  12. NAME=shadowsocksr
  13. uci_get_by_name() {
  14. local ret=$(uci get $NAME.$1.$2 2>/dev/null)
  15. echo ${ret:=$3}
  16. }
  17. uci_get_by_type() {
  18. local ret=$(uci get $NAME.@$1[0].$2 2>/dev/null)
  19. echo ${ret:=$3}
  20. }
  21. get_host_ip() {
  22. local host=$1
  23. local isip=""
  24. local ip=$host
  25. isip=$(echo $host | grep -E "([0-9]{1,3}[\.]){3}[0-9]{1,3}")
  26. if [ -z "$isip" ]; then
  27. if [ "$host" != "${host#*:[0-9a-fA-F]}" ]; then
  28. ip=$host
  29. else
  30. local ip=$(resolveip -4 -t 3 $host | awk 'NR==1{print}')
  31. # local hostip=$(ping $host -W 1 -s 1 -c 1 | grep PING | cut -d'(' -f 2 | cut -d')' -f1)
  32. [ -z "$ip" ] && ip=$(wget -q -O- http://119.29.29.29/d?dn=$1 | awk -F ';' '{print $1}')
  33. fi
  34. fi
  35. echo ${ip:="ERROR"}
  36. }
  37. server_process_count=$1
  38. redir_tcp_process=$2
  39. redir_udp_process=$3
  40. tunnel_process=$4
  41. kcp_process=$5
  42. local_process=$6
  43. pdnsd_process=$7
  44. if [ -z "$pdnsd_process" ]; then
  45. pdnsd_process=0
  46. fi
  47. i=0
  48. GLOBAL_SERVER=$(uci_get_by_type global global_server)
  49. server=$(get_host_ip $(uci_get_by_name $GLOBAL_SERVER server))
  50. [ "$server" == "ERROR" ] && hostip=$(uci_get_by_name $GLOBAL_SERVER ip)
  51. lkcp_port=$(uci_get_by_name $GLOBAL_SERVER kcp_port)
  52. server_port=$(uci_get_by_name $GLOBAL_SERVER server_port)
  53. password=$(uci_get_by_name $GLOBAL_SERVER kcp_password)
  54. kcp_param=$(uci_get_by_name $GLOBAL_SERVER kcp_param)
  55. [ "$password" != "" ] && password="--key "${password}
  56. while [ "1" == "1" ]; do #死循环
  57. sleep 000030s
  58. #redir tcp
  59. if [ "$redir_tcp_process" -gt 0 ]; then
  60. icount=$(busybox ps -w | grep ssr-retcp | grep -v grep | wc -l)
  61. if [ "$icount" == 0 ]; then
  62. logger -t "$NAME" "ssr redir tcp error.restart!"
  63. echo "$(date "+%Y-%m-%d %H:%M:%S") ssr redir tcp error.restart!" >>/tmp/ssrplus.log
  64. /etc/init.d/shadowsocksr restart
  65. exit 0
  66. fi
  67. fi
  68. #redir udp
  69. if [ "$redir_udp_process" -gt 0 ]; then
  70. icount=$(busybox ps -w | grep ssr-reudp | grep -v grep | wc -l)
  71. if [ "$icount" == 0 ]; then
  72. logger -t "$NAME" "ssr redir udp error.restart!"
  73. echo "$(date "+%Y-%m-%d %H:%M:%S") ssr redir udp error.restart!" >>/tmp/ssrplus.log
  74. /etc/init.d/shadowsocksr restart
  75. exit 0
  76. fi
  77. fi
  78. #tunnel
  79. if [ "$tunnel_process" -gt 0 ]; then
  80. icount=$(busybox ps -w | grep ssr-tunnel | grep -v grep | wc -l)
  81. if [ "$icount" == 0 ]; then
  82. logger -t "$NAME" "ssr tunnel error.restart!"
  83. echo "$(date "+%Y-%m-%d %H:%M:%S") ssr tunnel error.restart!" >>/tmp/ssrplus.log
  84. /etc/init.d/shadowsocksr restart
  85. exit 0
  86. fi
  87. fi
  88. #server
  89. if [ "$server_process_count" -gt 0 ]; then
  90. icount=$(busybox ps -w | grep ssr-server | grep -v grep | wc -l)
  91. if [ "$icount" -lt "$server_process_count" ]; then #如果进程挂掉就重启它
  92. logger -t "$NAME" "ssr server error.restart!"
  93. echo "$(date "+%Y-%m-%d %H:%M:%S") ssr server error.restart!" >>/tmp/ssrplus.log
  94. kill -9 $(busybox ps -w | grep ssr-server | grep -v grep | awk '{print $1}') >/dev/null 2>&1
  95. /etc/init.d/shadowsocksr restart
  96. exit 0
  97. fi
  98. fi
  99. #kcptun
  100. if [ "$kcp_process" -gt 0 ]; then
  101. icount=$(busybox ps -w | grep kcptun-client | grep -v grep | wc -l)
  102. if [ "$icount" -lt "$kcp_process" ]; then #如果进程挂掉就重启它
  103. logger -t "$NAME" "ssr kcptun error.restart!"
  104. echo "$(date "+%Y-%m-%d %H:%M:%S") ssr kcptun error.restart!" >>/tmp/ssrplus.log
  105. killall -q -9 kcptun-client
  106. (/usr/bin/kcptun-client -r $server:$kcp_port -l :$server_port $password $kcp_param &)
  107. fi
  108. fi
  109. #localsocks
  110. if [ "$local_process" -gt 0 ]; then
  111. icount=$(busybox ps -w | grep ssr-local | grep -v grep | wc -l)
  112. if [ "$icount" -lt "$local_process" ]; then #如果进程挂掉就重启它
  113. logger -t "$NAME" "global socks server error.restart!"
  114. echo "$(date "+%Y-%m-%d %H:%M:%S") global socks server error.restart!" >>/tmp/ssrplus.log
  115. kill -9 $(busybox ps -w | grep ssr-local | grep -v grep | awk '{print $1}') >/dev/null 2>&1
  116. /etc/init.d/shadowsocksr restart
  117. exit 0
  118. fi
  119. fi
  120. #pdnsd
  121. if [ "$pdnsd_process" -eq 1 ]; then
  122. icount=$(busybox ps -w | grep pdnsd | grep -v grep | wc -l)
  123. if [ "$icount" -lt "$pdnsd_process" ]; then #如果进程挂掉就重启它
  124. logger -t "$NAME" "pdnsd tunnel error.restart!"
  125. echo "$(date "+%Y-%m-%d %H:%M:%S") pdnsd tunnel error.restart!" >>/tmp/ssrplus.log
  126. if [ -f /var/run/pdnsd.pid ]; then
  127. kill $(cat /var/run/pdnsd.pid) >/dev/null 2>&1
  128. else
  129. kill -9 $(ps | grep pdnsd | grep -v grep | awk '{print $1}') >/dev/null 2>&1
  130. fi
  131. (/usr/sbin/pdnsd -c /var/etc/pdnsd.conf >/dev/null 2>&1 &)
  132. fi
  133. fi
  134. #dns2socks
  135. if [ "$pdnsd_process" -eq 2 ]; then
  136. icount=$(busybox ps -w | grep -e ssr-dns -e dns2socks | grep -v grep | wc -l)
  137. if [ "$icount" -lt 2 ]; then #如果进程挂掉就重启它
  138. logger -t "$NAME" "dns2socks $dnsstr tunnel error.restart!"
  139. echo "$(date "+%Y-%m-%d %H:%M:%S") dns2socks $dnsstr tunnel error.restart!" >>/tmp/ssrplus.log
  140. dnsstr=$(uci_get_by_type global tunnel_forward 8.8.4.4:53)
  141. dnsserver=$(echo "$dnsstr" | awk -F ':' '{print $1}')
  142. dnsport=$(echo "$dnsstr" | awk -F ':' '{print $2}')
  143. killall -q -9 dns2socks
  144. kill -9 $(busybox ps -w | grep ssr-dns | grep -v grep | awk '{print $1}') >/dev/null 2>&1
  145. microsocks -i 127.0.0.1 -p 10802 ssr-dns >/dev/null 2>&1 &
  146. dns2socks 127.0.0.1:10802 $dnsserver:$dnsport 127.0.0.1:5335 -q >/dev/null 2>&1 &
  147. fi
  148. fi
  149. done