1

У меня есть несколько серверов, у которых есть файл журнала, который я хотел бы отслеживать. Поскольку проект является новым и большинство ошибок до сих пор были уникальными, я хотел бы некоторое время отслеживать эти журналы вручную. Я надеялся сэкономить немного времени, поместив все IP-адреса для мониторинга в текстовый файл, а затем сделал что-то простое, например:

#!/bin/bash
while read ip; do
    scp user@"$ip":/var/log/file.log ./
    nano -w file.log
    rm -f file.log
done < ips.txt

Тем не менее, Nano (и Vi) абсолютно отключены, поскольку кажется, что цикл Bash не ждет, когда я выйду из них, прежде чем перейти к следующей команде.

Как заставить цикл Bash ждать выхода из текстового редактора, прежде чем продолжить? Не стесняйтесь быть техническими в объяснении ответа; частично я спрашиваю, потому что я недостаточно знаю о Баше, чтобы понять, почему это происходит, но я бы хотел.

3 ответа3

1

Я думаю, я знаю, что это такое. Поскольку вы перенаправляете ввод в цикл while, nano больше не видит ваш терминал на своем стандартном входе. Попробуйте заменить

nano -w file.log

с

nano -w file.log < /dev/tty
0

Рассматривать...

#!/bin/bash
while read ip; do
    scp user@"$ip":/var/log/file.log ./
    nano -w file.log && rm -f file.log
done < ips.txt

&& будет ожидать успешного завершения команды (возврат с 0), прежде чем выполнять операторы справа от нее.

edit: woops, после фактического запуска команды, @glennjackman прав. Кроме того, если вы хотите изучить некоторые вещи, связанные с bash, подумайте о прочтении начинающего TLDP Bash и расширенного Bash TLDP.

0

Оберните это в вызов time

Пример:

time nano -w file.log

Будет некоторый выходной выброс, который, я полагаю, вы можете перенаправить на /dev /null, если хотите, но "время" следует считать все еще работающим, в отличие от поведения редакторов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .