Эх сурвалжийг харах

优化 shell 脚本代码

dongzhaorui 1 жил өмнө
parent
commit
33e373deb6
1 өөрчлөгдсөн 53 нэмэгдсэн , 35 устгасан
  1. 53 35
      zgztb_cookie/start.sh

+ 53 - 35
zgztb_cookie/start.sh

@@ -1,44 +1,62 @@
 #!/bin/bash
 #!/bin/bash
 
 
-function check_time() {
-    time_subroutine=$(getconf CLK_TCK)
-    start_time=$(awk '{print $22}' /proc/$1/stat)
-    sys_uptime=$(awk '{print $1}' /proc/uptime)
-    pid_uptime=$((${sys_uptime%.*} - ${start_time} / ${time_subroutine}))
-    echo ${pid_uptime}
-    if [ ${pid_uptime} -ge 180 ]; then
-        kill -9 $1
-    fi
-}
+function check() {
+    local system_clock_frequency
+    system_clock_frequency="$(getconf CLK_TCK)"
 
 
-# 切换目录,在此目录下执行
-cd /mnt
+    local start_time # 进程开始时间
+    start_time="$(awk '{print $22}' /proc/$1/stat)"
 
 
+    local system_uptime  # 系统的运行时间
+    system_uptime="$(awk '{printf "%d", $1}' /proc/uptime)"
 
 
-for pid in $(ps -ef | grep -v grep | grep detail | awk '{print $2}'); do
-    echo $pid
-    check_time $pid
-    echo "关闭中国招标投标公共服务平台快照页爬虫"
-done
+    local running_time  # 进程运行时长
+    running_time="$(( (system_uptime - start_time / system_clock_frequency) ))"
 
 
+    echo "检查结果 pid:$1 进程:$2 运行时长:${running_time}s"
+    if [ ${running_time} -ge 180 ]; then
+        # 尝试发送终止信号,让进程自行处理退出操作
+        kill -9 "$1"
+    fi
+}
 
 
-echo "开始关闭自动化服务进程"
-for pid in $(ps -ef | grep -v grep | grep geckodriver | awk '{print $2}'); do
-    echo $pid
-    check_time $pid
-    echo "关闭驱动"
-done
-
-for pid in $(ps -ef | grep -v grep | grep firefox | awk '{print $2}'); do
-    echo $pid
-    check_time $pid
-    echo "关闭浏览器"
-done
+function restart() {
+    rm -rf /tmp/*
+    echo "重启采集服务..."
+    sleep 10
+    flock -xn /mnt/detail_normol.py -c 'nohup python3 detail_normol.py >/dev/null &'
+    sleep 5
+    flock -xn /mnt/detail_firefox.py -c 'nohup python3 detail_firefox.py >/dev/null &'
+}
 
 
-echo "rest启动服务"
-rm -rf /tmp/*
+function start() {
+    echo "中国招标投标公共服务平台 - 采集服务状态检查"
+
+    # 应用服务列表([索引]=用途:进程服务名)
+    appList=(
+        [0]="script:detail_firefox.py"
+        [1]="script:detail_normol.py"
+        [2]="driver:geckodriver"
+        [3]="browser:/usr/bin/firefox"
+    )
+
+    for elem in "${appList[@]}"; do
+        # IFS=":" IFS按照":"分割 应用类型(app_type)和进程名(app_name)
+        IFS=":" read -r app_type app_name <<< "$elem"
+        # 使用进程名查询进程pid
+        pids=$(pgrep -f "$app_name")
+        for pid in $pids; do
+            echo "开始检查 pid:$pid 进程:$app_name 所属类型:$app_type"
+            check "$pid" "$app_name"
+        done
+    done
+
+    restart
+
+    sleep 3
+    echo "关闭僵死进程..."
+    ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9
+}
 
 
-sleep 10
-flock -xn /mnt/detail_normol.py -c 'nohup python3 detail_normol.py >/dev/null &'
-sleep 5
-flock -xn /mnt/detail_firefox.py -c 'nohup python3 detail_firefox.py >/dev/null &'
+cd /mnt || exit 1
+start