Describe the bug
apply_configs (CLI, over SSH) sometimes never returns. The
python -m cli_progress wrapper process spins at ~90–95% CPU with no child
processes under it. All configs are in fact already applied — the hang is
purely in the progress-display layer. Killing the wrapper is safe.
Root cause pointer
common/utils.sh (~line 446) wraps the whole installer:
python -m cli_progress --title "Hiddify Manager" "$@"
Observed on 12.3.3 / Ubuntu 24.04: the wrapper busy-loops with no children for
tens of minutes after the underlying work is done. I have not traced it further
into cli_progress internals — reporting as observed. Possibly related to
terminal-state detection when there is no interactive TTY (no usable $TERM /
terminal width over a plain SSH exec), but that is a hypothesis, not a verified
cause.
The practical damage: users see a stuck "applying" screen, conclude the apply
failed, and start a second apply concurrently (see also the lock-related
behavior in install.sh) or abandon the box mid-way — while the config is
actually fine.
To Reproduce
Not yet deterministic on demand; happened repeatedly on this setup during
DNSTT-related applies over SSH (ssh host /opt/hiddify-manager/apply_configs.sh).
- Run
apply_configs from a non-interactive SSH session.
- Occasionally: wrapper stays alive forever at ~94% CPU,
ps --ppid <pid>
shows nothing.
- Configs and services are in their target state.
Expected behavior
The progress wrapper must exit when the wrapped pipeline is done, and must
never busy-loop without children.
Environment
- Hiddify Manager: 12.3.3
- OS: Ubuntu 24.04, kernel 6.8
- Invocation:
apply_configs over SSH, non-interactive
Suggested directions
- Fall back to plain passthrough logging when no interactive TTY is detected.
- Add a watchdog inside the wrapper (exit when the child pipeline is gone).
- On pipeline completion, flush and exit instead of continuing to animate.
Workaround for users
timeout 600 /opt/hiddify-manager/apply_configs.sh
then verify by inspecting services/configs rather than trusting the progress
bar. A hung wrapper can be killed safely — the install itself has already
completed.
Describe the bug
apply_configs(CLI, over SSH) sometimes never returns. Thepython -m cli_progresswrapper process spins at ~90–95% CPU with no childprocesses under it. All configs are in fact already applied — the hang is
purely in the progress-display layer. Killing the wrapper is safe.
Root cause pointer
common/utils.sh(~line 446) wraps the whole installer:Observed on 12.3.3 / Ubuntu 24.04: the wrapper busy-loops with no children for
tens of minutes after the underlying work is done. I have not traced it further
into
cli_progressinternals — reporting as observed. Possibly related toterminal-state detection when there is no interactive TTY (no usable
$TERM/terminal width over a plain SSH exec), but that is a hypothesis, not a verified
cause.
The practical damage: users see a stuck "applying" screen, conclude the apply
failed, and start a second apply concurrently (see also the lock-related
behavior in
install.sh) or abandon the box mid-way — while the config isactually fine.
To Reproduce
Not yet deterministic on demand; happened repeatedly on this setup during
DNSTT-related applies over SSH (
ssh host /opt/hiddify-manager/apply_configs.sh).apply_configsfrom a non-interactive SSH session.ps --ppid <pid>shows nothing.
Expected behavior
The progress wrapper must exit when the wrapped pipeline is done, and must
never busy-loop without children.
Environment
apply_configsover SSH, non-interactiveSuggested directions
Workaround for users
then verify by inspecting services/configs rather than trusting the progress
bar. A hung wrapper can be killed safely — the install itself has already
completed.