try fix always retry

This commit is contained in:
shenmo 2024-12-01 23:22:14 +08:00
parent a7b32db9b5
commit 5a37f24145
2 changed files with 49 additions and 42 deletions
pkg/usr/lib/systemd/system
tool/update-upgrade

@ -2,13 +2,14 @@
Description=Spark Store update notifier Description=Spark Store update notifier
After=apt-daily.service network.target network-online.target systemd-networkd.service NetworkManager.service connman.service After=apt-daily.service network.target network-online.target systemd-networkd.service NetworkManager.service connman.service
[Service] [Service]
Type=simple Type=simple
RemainAfterExit=yes RemainAfterExit=yes
ExecStart=/opt/durapps/spark-store/bin/update-upgrade/ss-update-notifier.sh ExecStart=/opt/durapps/spark-store/bin/update-upgrade/ss-update-notifier.sh
Restart=on-failure Restart=on-failure
RestartSec=10 RestartSec=15 # 可以设置为更长的重试间隔,比如 15 秒或 30 秒
StartLimitIntervalSec=1h # 设置为 1 小时的时间窗口
StartLimitBurst=3 # 最大允许失败次数为 3 次
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target

@ -1,16 +1,12 @@
#!/bin/bash #!/bin/bash
source /opt/durapps/spark-store/bin/bashimport/transhell.amber source /opt/durapps/spark-store/bin/bashimport/transhell.amber
load_transhell_debug load_transhell_debug
############################################################# #############################################################
# 发送通知 # 发送通知
function notify-send() { function notify-send() {
# Detect user using the display # Detect user using the display
local user=$(who | awk '{print $1}' | head -n 1) local user=$(who | awk '{print $1}' | head -n 1)
@ -20,11 +16,8 @@ function notify-send() {
sudo -u $user DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${uid}/bus notify-send "$@" sudo -u $user DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${uid}/bus notify-send "$@"
} }
# 检测网络链接畅通 # 检测网络链接畅通
function network-check() function network-check() {
{
# 超时时间 # 超时时间
local timeout=15 local timeout=15
@ -32,9 +25,9 @@ function network-check()
local target=www.baidu.com local target=www.baidu.com
# 获取响应状态码 # 获取响应状态码
local ret_code=`curl -I -s --connect-timeout ${timeout} ${target} -w %{http_code} | tail -n1` local ret_code=$(curl -I -s --connect-timeout ${timeout} ${target} -w %{http_code} | tail -n1)
if [ "x$ret_code" = "x200" ] ; then if [ "$ret_code" = "200" ]; then
# 网络畅通 # 网络畅通
return 0 return 0
else else
@ -43,32 +36,47 @@ function network-check()
fi fi
} }
network-check # 初始化等待时间和最大等待时间
if [ $? -ne 0 ] ; then initial_wait_time=15 # 初始等待时间 15 秒
echo "$TRANSHELL_CONTENT_NETWORK_FAIL" max_wait_time=$((12 * 3600)) # 最大等待时间 12 小时
exit -1
fi
# The code above is modified from https://blog.csdn.net/yaxuan88521/article/details/120516298 # 检测网络,若不通则进行重试,采用指数退避算法
wait_time=$initial_wait_time
while ! network-check; do
echo "$TRANSHELL_CONTENT_NETWORK_FAIL"
echo "Waiting for network to recover... Retrying in ${wait_time} seconds."
sleep $wait_time
wait_time=$((wait_time * 2)) # 等待时间翻倍
if [ $wait_time -gt $max_wait_time ]; then
wait_time=$max_wait_time # 最大等待时间限制为12小时
fi
done
# 每日更新星火源文件 # 每日更新星火源文件
aptss update aptss update
updatetext=`LANGUAGE=en_US aptss ssupdate 2>&1` updatetext=`LANGUAGE=en_US aptss ssupdate 2>&1`
until [ "`echo $updatetext | grep E: `" = "" ];do # 在网络恢复后,继续更新操作
echo "${TRANSHELL_CONTENT_UPDATE_ERROR_AND_WAIT_15_SEC}" retry_count=0
sleep 15 max_retries=12 # 最大重试次数,防止死循环
updatetext=`LANGUAGE=en_US aptss ssupdate 2>&1`
until ! echo $updatetext | grep -q "E:"; do
if [ $retry_count -ge $max_retries ]; then
echo "Reached maximum retry limit for aptss ssupdate."
exit 1
fi
echo "${TRANSHELL_CONTENT_UPDATE_ERROR_AND_WAIT_15_SEC}"
sleep 15
updatetext=`LANGUAGE=en_US aptss ssupdate 2>&1`
retry_count=$((retry_count + 1))
done done
update_app_number=$(env LANGUAGE=en_US /usr/bin/apt -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf list --upgradable -o Dir::Etc::sourcelist="/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list" -o Dir::Etc::sourceparts="/dev/null" -o APT::Get::List-Cleanup="0" 2>/dev/null | grep -c upgradable) update_app_number=$(env LANGUAGE=en_US /usr/bin/apt -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf list --upgradable -o Dir::Etc::sourcelist="/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list" -o Dir::Etc::sourceparts="/dev/null" -o APT::Get::List-Cleanup="0" 2>/dev/null | grep -c upgradable)
if [ "$update_app_number" -le 0 ] ; then if [ "$update_app_number" -le 0 ]; then
exit 0 exit 0
fi fi
@ -78,43 +86,41 @@ PKG_LIST="$(/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh
IFS_OLD="$IFS" IFS_OLD="$IFS"
IFS=$'\n' IFS=$'\n'
for line in $PKG_LIST ; do for line in $PKG_LIST; do
PKG_NAME=$(echo $line | awk -F ' ' '{print $1}') PKG_NAME=$(echo $line | awk -F ' ' '{print $1}')
PKG_NEW_VER=$(echo $line | awk -F ' ' '{print $2}') PKG_NEW_VER=$(echo $line | awk -F ' ' '{print $2}')
PKG_CUR_VER=$(echo $line | awk -F ' ' '{print $3}') PKG_CUR_VER=$(echo $line | awk -F ' ' '{print $3}')
dpkg --compare-versions $PKG_NEW_VER le $PKG_CUR_VER dpkg --compare-versions $PKG_NEW_VER le $PKG_CUR_VER
if [ $? -eq 0 ] ; then if [ $? -eq 0 ]; then
let update_app_number=$update_app_number-1 let update_app_number=$update_app_number-1
continue continue
fi fi
## 检测是否是 hold 状态 # 检测是否是 hold 状态
PKG_STA=$(dpkg-query -W -f='${db:Status-Want}' $PKG_NAME) PKG_STA=$(dpkg-query -W -f='${db:Status-Want}' $PKG_NAME)
if [ "$PKG_STA" = "hold" ] ; then if [ "$PKG_STA" = "hold" ]; then
let update_app_number=$update_app_number-1 let update_app_number=$update_app_number-1
fi fi
done done
# 还原分隔符 # 还原分隔符
IFS="$IFS_OLD" IFS="$IFS_OLD"
if [ $update_app_number -le 0 ] ; then if [ $update_app_number -le 0 ]; then
exit 0 exit 0
fi fi
update_transhell update_transhell
## 如果都是hold或者版本一致的那就直接退出否则把剩余的给提醒了 # 如果都是hold或者版本一致的那就直接退出否则把剩余的给提醒了
# TODO: 除了apt-mark hold之外额外有一个禁止检查列表
##TODO:除了apt-mark hold之外额外有一个禁止检查列表 # 如果不想提示就不提示
## 如果不想提示就不提示
user=$(who | awk '{print $1}' | head -n 1) user=$(who | awk '{print $1}' | head -n 1)
if [ -e "/home/$user/.config/spark-union/spark-store/ssshell-config-do-not-show-upgrade-notify" ];then if [ -e "/home/$user/.config/spark-union/spark-store/ssshell-config-do-not-show-upgrade-notify" ]; then
echo "他不想站在世界之巅,好吧" echo "他不想站在世界之巅,好吧"
echo "Okay he don't want to be at the top of the world, okay" echo "Okay he don't want to be at the top of the world, okay"
exit exit
else else
notify-send -a spark-store "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_NOTIFY}" "${TRANSHELL_CONTENT_THERE_ARE_APPS_TO_UPGRADE}" notify-send -a spark-store "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_NOTIFY}" "${TRANSHELL_CONTENT_THERE_ARE_APPS_TO_UPGRADE}"
fi fi