diff options
author | Gerd v. Egidy <lists@egidy.de> | 2012-08-21 17:03:40 +0200 |
---|---|---|
committer | Eric Blake <eblake@redhat.com> | 2012-08-21 15:52:26 -0600 |
commit | c18dc28b1ff29282ca1effc41c42f9c621fdadd1 (patch) | |
tree | b5a20dcd387e0366ebeffc47bd759a5e4ab87c85 /tools | |
parent | qemu: Disk Geometry Override Support (diff) | |
download | libvirt-c18dc28b1ff29282ca1effc41c42f9c621fdadd1.tar.gz libvirt-c18dc28b1ff29282ca1effc41c42f9c621fdadd1.tar.bz2 libvirt-c18dc28b1ff29282ca1effc41c42f9c621fdadd1.zip |
output status information during guest shutdown again
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.
Diffstat (limited to 'tools')
-rw-r--r-- | tools/libvirt-guests.init.sh | 65 | ||||
-rw-r--r-- | 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 d5d42d6fd..99ef33124 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 db28f3ff6..0f0c41c0b 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 |