Since the move to systemd libvirt-guests doesn't output this progress
information anymore. This patch brings back this feature.
It is helpful to show the admin what the system is waiting for and what
is left of the timeout (e.g. for calibrating the shutdown timing of a ups).
Rewriting the current line with \r doesn't work anymore in the context
of systemd. So always write new lines, but move to 5 second intervals
to avoid flooding the console.
This is version 2 of the patch and includes fixes as suggested by Eric Blake.
---
tools/libvirt-guests.init.sh | 65 +++++++++++++++++++++++++++++++----------
tools/libvirt-guests.service.in | 1 +
2 files changed, 51 insertions(+), 15 deletions(-)
diff --git a/tools/libvirt-guests.init.sh b/tools/libvirt-guests.init.sh
index d5d42d6..99ef331 100644
--- a/tools/libvirt-guests.init.sh
+++ b/tools/libvirt-guests.init.sh
@@ -225,22 +225,27 @@ suspend_guest()
name=$(guest_name "$uri" "$guest")
label=$(eval_gettext "Suspending \$name: ")
bypass=
+ slept=0
test "x$BYPASS_CACHE" = x0 || bypass=--bypass-cache
- printf %s "$label"
+ printf '%s...\n' "$label"
run_virsh "$uri" managedsave $bypass "$guest" >/dev/null
&
virsh_pid=$!
while true; do
sleep 1
kill -0 "$virsh_pid" >/dev/null 2>&1 || break
- progress=$(run_virsh_c "$uri" domjobinfo "$guest"
2>/dev/null | \
- awk '/^Data processed:/{print $3, $4}')
- if [ -n "$progress" ]; then
- printf '\r%s%12s ' "$label" "$progress"
- else
- printf '\r%s%-12s ' "$label" "..."
+
+ slept=$(($slept + 1))
+ if [ $(($slept % 5)) -eq 0 ]; then
+ progress=$(run_virsh_c "$uri" domjobinfo "$guest"
2>/dev/null | \
+ awk '/^Data processed:/{print $3, $4}')
+ if [ -n "$progress" ]; then
+ printf '%s%s\n' "$label" "$progress"
+ else
+ printf '%s%s\n' "$label" "..."
+ fi
fi
done
- retval wait "$virsh_pid" && printf '\r%s%-12s\n'
"$label" "$(gettext "done")"
+ retval wait "$virsh_pid" && printf '%s%s\n'
"$label" "$(gettext "done")"
}
# shutdown_guest URI GUEST
@@ -252,30 +257,41 @@ shutdown_guest()
guest=$2
name=$(guest_name "$uri" "$guest")
- label=$(eval_gettext "Shutting down \$name: ")
- printf %s "$label"
+ eval_gettext "Starting shutdown on guest: \$name"
+ echo
retval run_virsh "$uri" shutdown "$guest" >/dev/null ||
return
timeout=$SHUTDOWN_TIMEOUT
check_timeout=false
if [ $timeout -gt 0 ]; then
check_timeout=true
+ format=$(eval_gettext "Waiting for guest %s to shut down, %d seconds
left\n")
+ else
+ slept=0
+ format=$(eval_gettext "Waiting for guest %s to shut down\n")
fi
while ! $check_timeout || [ "$timeout" -gt 0 ]; do
sleep 1
guest_is_on "$uri" "$guest" || return
"$guest_running" || break
+
if $check_timeout; then
- timeout=$((timeout - 1))
- printf '\r%s%-12d ' "$label" "$timeout"
+ if [ $(($timeout % 5)) -eq 0 ]; then
+ printf "$format" "$name" "$timeout"
+ fi
+ timeout=$(($timeout - 1))
+ else
+ slept=$(($slept + 1))
+ if [ $(($slept % 5)) -eq 0 ]; then
+ printf "$format" "$name"
+ fi
fi
done
if guest_is_on "$uri" "$guest"; then
if "$guest_running"; then
- printf '\r%s%-12s\n' "$label" \
- "$(gettext "failed to shutdown in time")"
+ eval_gettext "Shutdown of guest \$name failed to complete in
time."
else
- printf '\r%s%-12s\n' "$label" "$(gettext
"done")"
+ eval_gettext "Shutdown of guest \$name complete."
fi
fi
}
@@ -356,6 +372,10 @@ shutdown_guests_parallel()
timeout=$SHUTDOWN_TIMEOUT
if [ $timeout -gt 0 ]; then
check_timeout=true
+ format=$(eval_gettext "Waiting for %d guests to shut down, %d seconds
left\n")
+ else
+ slept=0
+ format=$(eval_gettext "Waiting for %d guests to shut down\n")
fi
while [ -n "$on_shutdown" ] || [ -n "$guests" ]; do
while [ -n "$guests" ] &&
@@ -368,14 +388,29 @@ shutdown_guests_parallel()
on_shutdown="$on_shutdown $guest"
done
sleep 1
+
+ set -- $guests
+ guestcount=$#
+ set -- $on_shutdown
+ shutdowncount=$#
+
if $check_timeout; then
+ if [ $(($timeout % 5)) -eq 0 ]; then
+ printf "$format" $(($guestcount + $shutdowncount))
"$timeout"
+ fi
timeout=$(($timeout - 1))
if [ $timeout -le 0 ]; then
eval_gettext "Timeout expired while shutting down domains";
echo
RETVAL=1
return
fi
+ else
+ slept=$(($slept + 1))
+ if [ $(($slept % 5)) -eq 0 ]; then
+ printf "$format" $(($guestcount + $shutdowncount))
+ fi
fi
+
on_shutdown_prev=$on_shutdown
on_shutdown=$(check_guests_shutdown "$uri" "$on_shutdown")
print_guests_shutdown "$uri" "$on_shutdown_prev"
"$on_shutdown"
diff --git a/tools/libvirt-guests.service.in b/tools/libvirt-guests.service.in
index db28f3f..0f0c41c 100644
--- a/tools/libvirt-guests.service.in
+++ b/tools/libvirt-guests.service.in
@@ -10,6 +10,7 @@ ExecStart=/etc/init.d/libvirt-guests start
ExecStop=/etc/init.d/libvirt-guests stop
Type=oneshot
RemainAfterExit=yes
+StandardOutput=journal+console
[Install]
WantedBy=multi-user.target
--
1.7.11.4