fix: make installer and uninstaller completion reliable
TallyNote release / linux-x64 (push) Successful in 6m23s

This commit is contained in:
Qiufeng
2026-09-02 07:59:41 +08:00
parent 26fbec49ad
commit 5dcf9d0f61
7 changed files with 41 additions and 21 deletions
+18 -2
View File
@@ -19,6 +19,7 @@ SBIN_DIR=${TALLYNOTE_SBIN_DIR:-/usr/local/sbin}
LIBEXEC_DIR=${TALLYNOTE_LIBEXEC_DIR:-/usr/local/libexec}
SYSTEMCTL_BIN=systemctl
SYSTEMCTL_AVAILABLE=0
SYSTEMCTL_TIMEOUT_SECONDS=${TALLYNOTE_UNINSTALL_SYSTEMCTL_TIMEOUT_SECONDS:-30}
PURGE_DATA=0
PURGE_CONFIG=0
YES=0
@@ -52,6 +53,7 @@ if [[ "$TEST_MODE" != true && "$TEST_MODE" != false && "$TEST_MODE" != 1 && "$TE
fi
if [[ "$TEST_MODE" == 1 ]]; then TEST_MODE=true; fi
if [[ "$TEST_MODE" == 0 ]]; then TEST_MODE=false; fi
[[ "$SYSTEMCTL_TIMEOUT_SECONDS" =~ ^[1-9][0-9]*$ ]] || die 'TALLYNOTE_UNINSTALL_SYSTEMCTL_TIMEOUT_SECONDS must be a positive integer'
while (($#)); do
case "$1" in
@@ -296,7 +298,13 @@ run_systemctl() {
else
command -v "$SYSTEMCTL_BIN" >/dev/null 2>&1 || return 0
fi
"$SYSTEMCTL_BIN" "$@"
# A stuck systemd/dbus call must not leave the uninstaller looking frozen.
# Test fixtures intentionally bypass the external timeout command.
if [[ "$TEST_MODE" != true ]] && command -v timeout >/dev/null 2>&1; then
timeout "$SYSTEMCTL_TIMEOUT_SECONDS" "$SYSTEMCTL_BIN" "$@"
else
"$SYSTEMCTL_BIN" "$@"
fi
}
stop_services() {
@@ -311,8 +319,10 @@ stop_services() {
done
return 0
fi
log "正在停止 TallyNote 服务(systemd 操作超时 ${SYSTEMCTL_TIMEOUT_SECONDS} 秒)"
for unit in tallynote-update.path tallynote-update.service tallynote.service; do
active=0
log "检查服务:$unit"
if run_systemctl is-active --quiet "$unit" >/dev/null 2>&1; then
active=1
else
@@ -323,13 +333,17 @@ stop_services() {
esac
fi
if (( active )); then
run_systemctl stop "$unit" || die "无法停止服务:$unit"
log "停止服务:$unit"
run_systemctl stop "$unit" || die "无法停止服务:$unit(如果 systemd 正在等待进程退出,请稍后重试)"
log "已停止服务:$unit"
fi
if [[ -e "$UNIT_DIR/$unit" ]]; then
log "禁用服务:$unit"
run_systemctl disable "$unit" >/dev/null 2>&1 || die "无法禁用服务:$unit"
fi
done
run_systemctl daemon-reload >/dev/null 2>&1 || die 'systemd daemon-reload 失败'
log 'systemd 服务已停止并禁用'
}
validate_systemctl() {
@@ -464,8 +478,10 @@ main() {
die '检测到未完成的更新状态;确认更新已停止后使用 --force 重试'
fi
log "target: prefix=$PREFIX data=$DATA_DIR config=$CONFIG_DIR"
log '开始移除 TallyNote 文件和服务配置'
stop_services
remove_prefix
log '发布文件和更新组件已移除'
remove_file_if_owned "$UNIT_DIR/tallynote.service" 'service unit'
remove_file_if_owned "$UNIT_DIR/tallynote-update.service" 'updater unit'
remove_file_if_owned "$UNIT_DIR/tallynote-update.path" 'path unit'