Vagrant Provisioning: обработка выходных данных CLI Bash - PullRequest
0 голосов
/ 25 сентября 2019

Я использую функцию счетчика, которую я использую для ожидания и возврата кодов завершения в долго выполняющихся процессах.

Мы поместим это в пример сценария с вызовом для некоторой подготовки ...

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?

...