Просмотр исходного кода

优化Shell守护脚本,解决在目标进程的可执行文件被删除或升级期间,守护脚本可能判断错误,从而导致同一时刻目标进程启动了多个实例的问题

niujiuru 1 месяц назад
Родитель
Сommit
23a5250b09
1 измененных файлов с 7 добавлено и 6 удалено
  1. 7 6
      scripts/modules/funcs/functions.sh

+ 7 - 6
scripts/modules/funcs/functions.sh

@@ -59,18 +59,18 @@ is_running()
   [ -n "$target" ] || return 1
 
   for pid in /proc/[0-9]*; do
-    [ -r "$pid/exe" ] || continue
     exe=$(readlink "$pid/exe" 2>/dev/null) || continue
+    exe="${exe% *}"
     [ "$exe" = "$target" ] && return 0
   done
 
   return 1
 }
 
-# kill program(s) by name
+# kill program(s) by path
 # $1: program's executable path
 # $2: signal to send (default: 15)
-kill_programs()
+kill_by_path()
 {
   local target="$1" pid exe
   local sig=${2:-15}
@@ -83,8 +83,8 @@ kill_programs()
   [ "$sig" -ge 1 -a "$sig" -le 64 ] 2>/dev/null || return 1
 
   for pid in /proc/[0-9]*; do
-    [ -r "$pid/exe" ] || continue
     exe=$(readlink "$pid/exe" 2>/dev/null) || continue
+    exe="${exe% *}"
     if [ "$exe" = "$target" ]; then
       kill -$sig "${pid##*/}" 2>/dev/null
     fi
@@ -96,13 +96,14 @@ kill_programs()
 # $1: program's executable path
 # $2: timeout in seconds (default: 5)
 # return 0 if terminated gracefully
+# return 1 function failed
 # return 2 if force killed after timeout
 graceful_kill() {
   local target="$1" timeout="${2:-5}" waited=0
 
   [ -n "$target" ] || return 1
 
-  kill_programs "$target" 15 || return 1
+  kill_by_path "$target" 15 || return 1
 
   while is_running "$target" && [ "$waited" -lt "$timeout" ]; do
     sleep 1
@@ -110,7 +111,7 @@ graceful_kill() {
   done
 
   if is_running "$target"; then
-    kill_programs "$target" 9
+    kill_by_path "$target" 9
     return 2
   fi