Я использую функцию счетчика, которую я использую для ожидания и возврата кодов завершения в долго выполняющихся процессах.
Мы поместим это в пример сценария с вызовом для некоторой подготовки ...
provision.sh
# Usage `spinner <pid> <display_text>`
# Call spinner last background execution with `spinner $!`
# Will return the exit status of the watched process.
function spinner() {
local pid=$1
local delay=0.5
local spinstr='\|/-'
while ps a | awk '{print $1}' | grep -q "$pid" ; do
local temp=${spinstr#?}
printf "[%c] %s..." "$spinstr" "$2"
local spinstr=$temp${spinstr%"$temp"}
sleep $delay
printf "\r"
done
wait "$pid"
exit_code=$?
if [[ $exit_code -eq 0 ]]; then
printf "[√] %s...\n" "$2"
else
printf "[X] %s...\n" "$2"
return $exit_code
fi
}
{ sleep 5 & } > /dev/null
spinner $! "sleeping"
И создайте пример бродячей машины, которая обеспечивает сценарий при каждом вызове -
Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "centos/7" # If you have box downloaded, use that...
config.vm.provision :shell, :run => 'always', :path => "provision.sh", :privileged => false
end
, чтобы вы могли запуститьvagrant up
и он будет запускать скрипт каждый раз ...
В зависимости от оценки while
, vagrant будет либо ждать завершения процесса, а затем публиковать результат - либо будет прокручивать стандартный вывод.
Все вычисления работают одинаково с bash.
Но только при обработке строки awk вывод CLI ожидает.
# vagrant will wait for the process to finish
# ps a | awk '{print $1}' | grep -q "$pid"
# vagrant scrolls the printf output
# ps -o pid= | grep -q "$pid"
# ps -p "${pid}" -o pid= >/dev/null
# [ -n "$(ps -p $pid -o pid=)" ]
# [ -n "$pid" -a -e "/proc/$pid" ]
Пример: ps a | awk '{print $1}' | grep -q "$pid"
default: Running: /var/folders/yc/q86r3m0d4vv6m9l5w2dv4b2r0000gn/T/vagrant-shell20190925-62667-22tu3t.sh
default: [√] sleeping...
Пример: ps -o pid= | grep -q "$pid"
default: Running: /var/folders/yc/q86r3m0d4vv6m9l5w2dv4b2r0000gn/T/vagrant-shell20190925-62746-1vjaa0w.sh
default: [\] sleeping...
default: [|] sleeping...
default: [/] sleeping...
default: [-] sleeping...
default: [\] sleeping...
default: [|] sleeping...
default: [/] sleeping...
default: [-] sleeping...
default: [\] sleeping...
default: [|] sleeping...
default: [√] sleeping...
Насколько я понимаю, обеспечение Vagrant "опрашивает" stdout и stderr с клиентского компьютера.Так что я не думаю, что есть какой-то способ на самом деле вывести спиннер в бродячий кли без написания чего-то очень умного в рубине ...
Я пытаюсь понять разницу в поведении вво время оценки и почему выходные данные изменяются с помощью бродячей подготовки.
Я добавил set -x
к сценарию, и появляется разница в обработке ...
default: ++ spinner 24289 sleeping
default: ++ local pid=24289
default: ++ local delay=1
default: ++ sleep 5
default: ++ ps a
default: ++ awk '{print $1}'
default: ++ grep -q 24289
default: ++ wait 24289
default: [√] sleeping...
default: ++ exit_code=0
default: ++ [[ 0 -eq 0 ]]
default: ++ printf '[√] %s...\n' sleeping
против
default: ++ spinner 24162 sleeping
default: ++ local pid=24162
default: ++ local delay=1
default: ++ sleep 5
default: ++ grep -q 24162
default: ++ ps -o pid=
default: ++ printf %s... sleeping
default: ++ sleep 1
default: ++ printf '\r'
default: ++ ps -o pid=
default: ++ grep -q 24162
default: ++ printf %s... sleeping
default: ++ sleep 1
default: ++ printf '\r'
...
default: ++ grep -q 24162
default: ++ ps -o pid=
default: [√] sleeping...
default: ++ wait 24162
default: ++ exit_code=0
default: ++ [[ 0 -eq 0 ]]
default: ++ printf '[√] %s...\n' sleeping
В оболочке инициатора - она проверяет условие, но, кажется, не обрабатывает счетчик, а движется прямо к ожиданию?Это связано с обработкой grep?