修改换库后出现的崩溃问题,编译脚本修改,进程控制脚本添加调试

This commit is contained in:
lnk
2026-06-17 16:20:13 +08:00
parent 0b8a6739f6
commit 5e933b6729
7 changed files with 187 additions and 53 deletions

View File

@@ -7,6 +7,14 @@
# @author: lunankun
#前置all的重置或者新增都是由稳态的第一个进程来处理所有进程收到这条消息后先判断自己的进程号是否是1而且是稳态否则不处理所有操作均由这个进程完成
# 默认使用正式版
FE_BIN="${FE_BIN:-pt61850netd_pqfe}"
# 如果最后一个参数是 debug则使用调试版并传给 detached 子进程
if [ "$#" -gt 0 ] && [ "${!#}" = "debug" ]; then
export FE_BIN="pt61850netd_pqfed"
set -- "${@:1:$(($#-1))}"
fi
if [ -z "$SETSID" ]; then
export SETSID=1
@@ -44,6 +52,48 @@ fi
echo $$ > "$LOCK_FILE"
trap "rm -f $LOCK_FILE" EXIT
start_fe_by_runtime_debug() {
local RUNTIME_CF_FILE="/FeProject/etc/runtime.cf"
local LINE BINPATH BIN SPECIAL SLEEPSEC STARTFLAG CMD_STR
log "[DEBUG_START] start processes from $RUNTIME_CF_FILE"
while IFS= read -r LINE; do
[ -z "$LINE" ] && continue
[ "${LINE:0:1}" = "#" ] && continue
BINPATH=$(echo "$LINE" | awk -F '^' '{printf $1}' | sed 's/^[[:space:]]*//; s/[[:space:]]*$//')
BIN=$(echo "$LINE" | awk -F '^' '{printf $2}' | sed 's/^[[:space:]]*//; s/[[:space:]]*$//')
SPECIAL=$(echo "$LINE" | awk -F '^' '{printf $4}' | sed 's/^[[:space:]]*//; s/[[:space:]]*$//')
SLEEPSEC=$(echo "$LINE" | awk -F '^' '{printf $5}' | sed 's/^[[:space:]]*//; s/[[:space:]]*$//')
STARTFLAG=$(echo "$LINE" | awk -F '^' '{printf $7}' | sed 's/^[[:space:]]*//; s/[[:space:]]*$//')
if echo "$BIN" | grep -q '^fe_watchdog'; then
log "[DEBUG_START] skip watchdog: $BIN"
continue
fi
[ "$STARTFLAG" = "IGNORE_START" ] && continue
[ -z "$BINPATH" ] || [ -z "$BIN" ] && continue
[ -z "$SLEEPSEC" ] && SLEEPSEC=0
sleep "$SLEEPSEC"
CMD_STR="cd $BINPATH && ./$BIN $SPECIAL"
log "[DEBUG_START] $CMD_STR"
nohup setsid sh -c "$CMD_STR" >>"$LOGFILE" 2>&1 < /dev/null &
done < "$RUNTIME_CF_FILE"
}
start_fe_by_mode() {
if [ "$FE_BIN" = "pt61850netd_pqfed" ]; then
start_fe_by_runtime_debug
else
/FeProject/boot/start_fe.sh
fi
}
get_ini_value() {
local key="$1"
local line
@@ -96,7 +146,7 @@ check_remote_conn_released() {
for i in $(seq 1 20); do
if ! ss -ntp 2>/dev/null \
| grep "${REMOTE_IP}:${REMOTE_PORT}" \
| grep -E 'pt61850netd_pqfe|fe_watchdog|fe_main' >/dev/null; then
| grep -E "${FE_BIN}|fe_watchdog|fe_main" >/dev/null; then
log "[OK] Remote ${REMOTE_IP}:${REMOTE_PORT} released"
return 0
fi
@@ -104,7 +154,7 @@ check_remote_conn_released() {
log "[WAIT] Remote ${REMOTE_IP}:${REMOTE_PORT} still exists... ($i/20)"
ss -ntp 2>/dev/null \
| grep "${REMOTE_IP}:${REMOTE_PORT}" \
| grep -E 'pt61850netd_pqfe|fe_watchdog|fe_main' \
| grep -E "${FE_BIN}|fe_watchdog|fe_main" \
| tee -a "$LOGFILE"
sleep 1
done
@@ -116,7 +166,7 @@ check_remote_conn_released() {
log "[FAIL] Remote ${REMOTE_IP}:${REMOTE_PORT} still exists:"
ss -ntp 2>/dev/null \
| grep "${REMOTE_IP}:${REMOTE_PORT}" \
| grep -E 'pt61850netd_pqfe|fe_watchdog|fe_main' \
| grep -E "${FE_BIN}|fe_watchdog|fe_main" \
| tee -a "$LOGFILE"
return 1
@@ -280,7 +330,7 @@ kill_process_by_name() {
wait_all_exit() {
for i in $(seq 1 30); do
COUNT=$(ps -ef | grep -E 'pt61850netd_pqfe|fe_watchdog' | grep -v grep | wc -l)
COUNT=$(ps -ef | grep -E "${FE_BIN}|fe_watchdog" | grep -v grep | wc -l)
if [ "$COUNT" -eq 0 ]; then
echo "All FE processes exited"
return 0
@@ -304,16 +354,16 @@ handle_reset() {
#kill_process_by_name "/FeProject/bin/fe_watchdog"
# 关闭旧的 stat 进程
#kill_process_by_name "/FeProject/bin/pt61850netd_pqfe -d cfg_stat_data"
#kill_process_by_name "/FeProject/bin/${FE_BIN} -d cfg_stat_data"
# 关闭旧的 recall 进程
#kill_process_by_name "/FeProject/bin/pt61850netd_pqfe -d cfg_recallhis_data"
#kill_process_by_name "/FeProject/bin/${FE_BIN} -d cfg_recallhis_data"
# 关闭旧的 3s 进程
#kill_process_by_name "/FeProject/bin/pt61850netd_pqfe -d cfg_3s_data"
#kill_process_by_name "/FeProject/bin/${FE_BIN} -d cfg_3s_data"
# 关闭旧的 comtrade 进程
#kill_process_by_name "/FeProject/bin/pt61850netd_pqfe -d cfg_soe_comtrade"
#kill_process_by_name "/FeProject/bin/${FE_BIN} -d cfg_soe_comtrade"
/FeProject/boot/stop_fe.sh
@@ -336,23 +386,22 @@ handle_reset() {
#看门狗固定放在第一个防止stop时会把要杀死的进程重启
sed -i "2a\\$(printf '/FeProject/bin/ ^ fe_watchdog -m 18192 ^ ^ ^ 1 ^ IGNORE_RESTART ^\n')" /FeProject/etc/runtime.cf
# 进程号为 1按固定格式添加
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s 1_1^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s 1_1^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_3s_data^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_soe_comtrade^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
sed -i "2a/FeProject/bin/ ^ ${FE_BIN} -d cfg_stat_data -s 1_1^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
sed -i "2a/FeProject/bin/ ^ ${FE_BIN} -d cfg_recallhis_data -s 1_1^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
sed -i "2a/FeProject/bin/ ^ ${FE_BIN} -d cfg_3s_data^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
sed -i "2a/FeProject/bin/ ^ ${FE_BIN} -d cfg_soe_comtrade^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
else
#看门狗固定放在第一个防止stop时会把要杀死的进程重启
sed -i "2a\\$(printf '/FeProject/bin/ ^ fe_watchdog -m 18192 ^ ^ ^ 1 ^ IGNORE_RESTART ^\n')" /FeProject/etc/runtime.cf
# 进程号大于 1按 -s ${i}_ 格式添加
for i in $(seq 1 $1); do
# 在 runtime.cf 中插入对应的配置行,直接插入变量替换结果
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s ${i}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s ${i}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
sed -i "2a/FeProject/bin/ ^ ${FE_BIN} -d cfg_stat_data -s ${i}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
sed -i "2a/FeProject/bin/ ^ ${FE_BIN} -d cfg_recallhis_data -s ${i}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
done
#以下部分没有多进程
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_3s_data^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
sed -i "2a\\$(printf '/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_soe_comtrade^ ^ ^ 1 ^ ^\n')" /FeProject/etc/runtime.cf
sed -i "2a/FeProject/bin/ ^ ${FE_BIN} -d cfg_3s_data^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
sed -i "2a/FeProject/bin/ ^ ${FE_BIN} -d cfg_soe_comtrade^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
fi
@@ -363,8 +412,8 @@ handle_reset() {
sync
# 重新启动服务
/FeProject/boot/start_fe.sh
start_fe_by_mode
#/FeProject/boot/start_fe.sh
echo "****** reset all in $1******" >>"$LOGFILE"
elif [ "$2" == "stat" ]; then
@@ -373,19 +422,20 @@ handle_reset() {
# 根据进程号来添加新的进程配置
for i in $(seq 1 $1); do
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s ${i}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
sed -i "2a/FeProject/bin/ ^ ${FE_BIN} -d cfg_stat_data -s ${i}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
done
# 关闭旧的看门狗进程
kill_process_by_name "/FeProject/bin/fe_watchdog"
# 关闭旧的 stat 进程
kill_process_by_name "/FeProject/bin/pt61850netd_pqfe -d cfg_stat_data"
kill_process_by_name "/FeProject/bin/${FE_BIN} -d cfg_stat_data"
#sleep 5
# 启动服务不影响其他功能的进程
/FeProject/boot/start_fe.sh
start_fe_by_mode
#/FeProject/boot/start_fe.sh
echo "****** reset stat in $1******" >>"$LOGFILE"
elif [ "$2" == "recall" ]; then
@@ -394,18 +444,19 @@ handle_reset() {
# 根据进程号来添加新的进程配置
for i in $(seq 1 $1); do
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s ${i}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
sed -i "2a/FeProject/bin/ ^ ${FE_BIN} -d cfg_recallhis_data -s ${i}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
done
# 关闭旧的看门狗进程
kill_process_by_name "/FeProject/bin/fe_watchdog"
# 关闭旧的 recall 进程
kill_process_by_name "/FeProject/bin/pt61850netd_pqfe -d cfg_recallhis_data"
kill_process_by_name "/FeProject/bin/${FE_BIN} -d cfg_recallhis_data"
#sleep 5
# 启动服务不影响其他功能的进程
/FeProject/boot/start_fe.sh
start_fe_by_mode
#/FeProject/boot/start_fe.sh
echo "****** reset recall in $1******" >>"$LOGFILE"
else
@@ -429,22 +480,22 @@ handle_add() {
# 如果 $1 在 1 和 10 之间,进入处理逻辑
if [ "$2" == "all" ]; then
# 检查是否已存在该条目,避免重复添加
if ! grep -q "/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s ${1}_${1}^" /FeProject/etc/runtime.cf; then
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s ${1}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
if ! grep -q "/FeProject/bin/ ^ ${FE_BIN} -d cfg_stat_data -s ${1}_${1}^" /FeProject/etc/runtime.cf; then
sed -i "2a/FeProject/bin/ ^ ${FE_BIN} -d cfg_stat_data -s ${1}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
fi
if ! grep -q "/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s ${1}_${1}^" /FeProject/etc/runtime.cf; then
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s ${1}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
if ! grep -q "/FeProject/bin/ ^ ${FE_BIN} -d cfg_recallhis_data -s ${1}_${1}^" /FeProject/etc/runtime.cf; then
sed -i "2a/FeProject/bin/ ^ ${FE_BIN} -d cfg_recallhis_data -s ${1}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
fi
elif [ "$2" == "stat" ]; then
# 检查是否已存在该条目,避免重复添加
if ! grep -q "/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s ${1}_${1}^" /FeProject/etc/runtime.cf; then
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_stat_data -s ${1}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
if ! grep -q "/FeProject/bin/ ^ ${FE_BIN} -d cfg_stat_data -s ${1}_${1}^" /FeProject/etc/runtime.cf; then
sed -i "2a/FeProject/bin/ ^ ${FE_BIN} -d cfg_stat_data -s ${1}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
fi
elif [ "$2" == "recall" ]; then
# 检查是否已存在该条目,避免重复添加
if ! grep -q "/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s ${1}_${1}^" /FeProject/etc/runtime.cf; then
sed -i "2a/FeProject/bin/ ^ pt61850netd_pqfe -d cfg_recallhis_data -s ${1}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
if ! grep -q "/FeProject/bin/ ^ ${FE_BIN} -d cfg_recallhis_data -s ${1}_${1}^" /FeProject/etc/runtime.cf; then
sed -i "2a/FeProject/bin/ ^ ${FE_BIN} -d cfg_recallhis_data -s ${1}_${1}^ ^ ^ 1 ^ ^" /FeProject/etc/runtime.cf
fi
else
echo "****** process add type null ******"