Согласно странице руководства для apt-get
флаг -v
просто выводит версию apt-get
. Так что никакого программного обеспечения устанавливать не будет.
Запустить вместо этого
ssh -t root@111.111.111 'apt-get install -y expect'
Язык TXR имеет в своей библиотеке «конечные потоки» :это потоковые объекты, которые следуют за файлами динамического журнала, аналогично утилите tail -f
.
Вызов функции (open-tail "/path/to/it")
создает и возвращает хвостовой поток. Файл еще не должен существовать. Если и когда файл действительно существует, поток будет читать его до конца, а затем отслеживать его рост, внезапное уменьшение или исчезновение/появление, создавая приложению иллюзию плоского, бесконечного потока данных. Приложение должно читать из потока достаточно быстро, конечно, относительно того, как часто файл ротируется.
В следующей программе мы определяем структуру данных для отслеживания информации о каждой транзакции (запроса -пары ответов )и используем хвостовой поток для сканирования файла журнала с именем data
с использованием TXR. язык шаблонов.
Когда мы сопоставляем запрос, мы создаем новый объект транзакции и помещаем его в хэш-таблицу с ключом на основе идентификатора.
Когда мы видим код неудачного ответа (, отличный от 200 ), мы извлекаем транзакцию для идентификатора. Если он существует, мы обновляем его информацией ответа и печатаем (с помощью пользовательской функции печати объекта, которая регенерирует пару ответов XML-запрос -).
После сопоставления ответа, успешного или нет, мы удаляем соответствующую транзакцию из хеш-таблицы.
@(do
(defstruct xact nil
id
req-inner-xml
res-inner-xml
(:method print (me *stdout* pretty-p)
(cond
(pretty-p
(put-line "<dataReq>")
[mapdo put-line me.req-inner-xml]
(put-line "</dataReq>")
(put-line "<dataRes>")
[mapdo put-line me.res-inner-xml]
(put-line "</dataRes>"))
(t :))))
(defvarl xact (hash)))
@(next (open-tail "data"))
@(repeat)
@ (cases)
<dataReq>
@ (all)
<id>@id</id>
@ (and)
@ (collect)
@lines
@ (until)
</dataReq>
@ (end)
@ (end)
@ (do (set [xact id] (new xact
id id
req-inner-xml lines)))
@ (or)
<dataRes>
@ (all)
<id>@id</id>
@ (and)
@ (skip)
<errcode>
<errNum>@err</errNum>
</errcode>
@ (and)
@ (collect)
@lines
@ (until)
</dataRes>
@ (end)
@ (end)
@ (do
(whenlet ((x (del [xact id])))
(when (nequal err "200")
(set x.res-inner-xml lines)
(pprint x))))
@ (end)
@(end)