command_stop.sh 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. #!/bin/bash
  2. # LGSM command_stop.sh function
  3. # Author: Daniel Gibbs
  4. # Website: http://gameservermanagers.com
  5. lgsm_version="271215"
  6. # Description: Stops the server.
  7. local modulename="Stopping"
  8. function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))"
  9. sdtd_telnet(){
  10. sdtdshutdown=$( expect -c '
  11. proc abort {} {
  12. puts "Timeout or EOF\n"
  13. exit 1
  14. }
  15. spawn telnet '"${telnetip}"' '"${telnetport}"'
  16. expect {
  17. "password:" { send "'"${telnetpass}"'\r" }
  18. default abort
  19. }
  20. expect {
  21. "session." { send "shutdown\r" }
  22. default abort
  23. }
  24. expect { eof }
  25. puts "Completed.\n"
  26. ')
  27. }
  28. fn_stop_ark(){
  29. # grab the queryport. there are two locations to grab this from.
  30. # first start with the parameters from the parms line
  31. fn_printwarn "attempting to determine any in-use ports"
  32. fn_scriptlog "attempting to determine any in-use ports"
  33. #port=$(grep ^parms= arkserver |\
  34. # awk -F"QueryPort=" '{print $2}' |\
  35. # sed "s/[^[:digit:].*].*//g" )
  36. info_config.sh
  37. if [ -z $queryport ] ; then
  38. fn_printwarn "no queryport found in the arkserver script"
  39. fn_scriptlog "no queryport found in the arkserver script"
  40. userconfigfile="${filesdir}"
  41. userconfigfile+="/ShooterGame/Saved/Config/LinuxServer/GameUserSettings.ini"
  42. port=$(grep ^QueryPort= ${userconfigfile} | cut -d= -f2 | sed "s/[^[:digit:].*].*//g")
  43. fi
  44. if [ -z $queryport ] ; then
  45. fn_printwarn "no queryport found in the GameUsersettings.ini file"
  46. fn_scriptlog "no queryport found in the GameUsersettings.ini file"
  47. return
  48. fi
  49. if [[ ${#port} -gt 0 ]] ; then
  50. fn_printwarn "QueryPort $queryport found in the configs. Checking to see if it's still bound."
  51. fn_scriptlog "QueryPort $queryport found in the configs. Checking to see if it's still bound."
  52. pid=$(netstat -nap 2>/dev/null | grep ^udp[[:space:]] |\
  53. grep :${queryport}[[:space:]] | rev | awk '{print $1}' |\
  54. rev | cut -d\/ -f1)
  55. #
  56. # check for a valid pid
  57. let pid+=0 # turns an empty string into a valid number, '0',
  58. # and a valid numeric pid remains unchanged.
  59. if [[ $pid -gt 1 && $pid -le $(cat /proc/sys/kernel/pid_max) ]] ; then
  60. # kill the process still listening on that port.
  61. fn_printdots "Killing process $pid"
  62. fn_scriptlog "Killing process $pid"
  63. kill -9 $pid
  64. fi # end if for pid range check
  65. fn_printok "${servername} stopped and ports cleared"
  66. fn_scriptlog "Ports cleared for ${servername}"
  67. fi # end if for port check
  68. } # end of fn_stop_ark
  69. fn_stop_teamspeak3(){
  70. check.sh
  71. fn_printdots "${servername}"
  72. fn_scriptlog "${servername}"
  73. sleep 1
  74. info_ts3status.sh
  75. if [ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then
  76. fn_printfail "${servername} is already stopped"
  77. fn_scriptlog "${servername} is already stopped"
  78. else
  79. ${filesdir}/ts3server_startscript.sh stop > /dev/null 2>&1
  80. fn_printok "${servername}"
  81. fn_scriptlog "Stopped ${servername}"
  82. fi
  83. # Remove lock file
  84. rm -f "${rootdir}/${lockselfname}"
  85. sleep 1
  86. echo -en "\n"
  87. }
  88. fn_stop_tmux(){
  89. check.sh
  90. info_config.sh
  91. fn_printdots "${servername}"
  92. fn_scriptlog "${servername}"
  93. sleep 1
  94. if [ "${gamename}" == "7 Days To Die" ] ; then
  95. # if game is 7 Days To Die, we need special, graceful shutdown via telnet connection.
  96. # Set below variable to be called for expect to operate correctly..
  97. fn_printdots "Attempting graceful shutdown via telnet"
  98. fn_scriptlog "Attempting graceful shutdown via telnet"
  99. sleep 1
  100. telnetip=127.0.0.1
  101. sdtd_telnet
  102. # If failed using localhost will use servers ip
  103. refused=$(echo -en "\n ${sdtdshutdown}"| grep "Timeout or EOF")
  104. if [ -n "${refused}" ]; then
  105. telnetip=${ip}
  106. fn_printwarn "Attempting graceful shutdown via telnet: localhost failed"
  107. fn_scriptlog "Warning! Attempting graceful shutdown failed using localhost"
  108. sleep 5
  109. echo -en "\n"
  110. fn_printdots "Attempting graceful shutdown via telnet: using ${telnetip}"
  111. fn_scriptlog "Attempting graceful shutdown via telnet using ${telnetip}"
  112. sdtd_telnet
  113. sleep 1
  114. fi
  115. refused=$(echo -en "\n ${sdtdshutdown}"| grep "Timeout or EOF")
  116. completed=$(echo -en "\n ${sdtdshutdown}"| grep "Completed.")
  117. if [ -n "${refused}" ]; then
  118. fn_printfail "Attempting graceful shutdown via telnet"
  119. fn_scriptlog "Attempting graceful shutdown failed"
  120. fn_scriptlog "${refused}"
  121. elif [ -n "${completed}" ]; then
  122. fn_printok "Attempting graceful shutdown via telnet"
  123. fn_scriptlog "Attempting graceful shutdown succeeded"
  124. else
  125. fn_printfail "Attempting graceful shutdown via telnet: Unknown error"
  126. fn_scriptlog "Attempting graceful shutdown failed"
  127. fn_scriptlog "Unknown error"
  128. fi
  129. sleep 1
  130. echo -en "\n\n"
  131. echo -en "Telnet output:"
  132. echo -en "\n ${sdtdshutdown}"
  133. echo -en "\n\n"
  134. sleep 1
  135. fn_printdots "${servername}"
  136. fn_scriptlog "${servername}"
  137. sleep 5
  138. pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:")
  139. if [ "${pid}" == "0" ]; then
  140. fn_printok "${servername} is already stopped using graceful shutdown"
  141. fn_scriptlog "${servername} is already stopped using graceful shutdown"
  142. else
  143. tmux kill-session -t "${servicename}"
  144. fn_printok "${servername}"
  145. fn_scriptlog "Stopped ${servername}"
  146. fi
  147. else
  148. pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:")
  149. if [ "${pid}" == "0" ]; then
  150. fn_printfail "${servername} is already stopped"
  151. fn_scriptlog "${servername} is already stopped"
  152. else
  153. if [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then
  154. sleep 1
  155. fn_printdots "Attempting graceful shutdown"
  156. fn_scriptlog "Attempting graceful shutdown"
  157. tmux send -t "${servicename}" quit ENTER > /dev/null 2>&1
  158. counter=0
  159. while [ "${pid}" != "0" -a $counter -lt 30 ]; do
  160. pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:")
  161. sleep 1
  162. let counter=counter+1
  163. if [ "${counter}" -gt "1" ]; then
  164. fn_printdots "Attempting graceful shutdown: ${counter}"
  165. fi
  166. done
  167. pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:")
  168. if [ "${pid}" == "0" ]; then
  169. fn_printok "Attempting graceful shutdown"
  170. else
  171. fn_printfail "Attempting graceful shutdown"
  172. fi
  173. fi
  174. tmux kill-session -t "${servicename}" > /dev/null 2>&1
  175. fn_printok "${servername}"
  176. fn_scriptlog "Stopped ${servername}"
  177. fi
  178. fi
  179. # Remove lock file
  180. rm -f "${rootdir}/${lockselfname}"
  181. sleep 1
  182. echo -en "\n"
  183. }
  184. if [ "${gamename}" == "Teamspeak 3" ]; then
  185. fn_stop_teamspeak3
  186. else
  187. fn_stop_tmux
  188. if [ "${gamename}" == "ARK: Survivial Evolved" ]; then
  189. fn_stop_ark
  190. echo -en "\n"
  191. fi
  192. fi