Linux повторить команду несколько раз

Обновлено: 06.07.2024

Я пытаюсь найти простой способ повторного выполнения команды всякий раз, когда она завершается, по любой причине (ошибка или нет).

Как лучше всего подойти к этому?

РЕДАКТИРОВАТЬ: Я не был достаточно ясным, прежде чем. Мне нужно следующее выполнение, чтобы дождаться окончания предыдущего.

Команда watch будет повторять команду всегда с указанным интервалом:

Установка -n в ноль фактически устанавливает интервал в ничто (я думаю, что это действительно .1 секунды).

watch также имеют дополнительные преимущества выравнивания выходных данных, так что визуальные изменения могут быть легко видны, и имеют переключатель, чтобы выделить изменения с последнего запуска.

Это создает бесконечный цикл, выполняющий command снова и снова.

Простое решение будет:

; разделяет команды, позволяя использовать несколько команд в одной строке (Bash: Lists)

Вы можете планировать заранее во время выполнения команды (при условии, что она не является интерактивной) и ввести !! который выполнит предыдущую команду снова. Это работает, например, во время ping -c 5 .

Вы также можете определить функцию в bash :

Чтобы сохранить его, сохраните его в

Затем вы можете запустить свою команду следующим образом:

Если это определенная команда, которую вы хотите выполнить многократно (а не, например, какая-либо команда), вы можете заменить "$@" в этом фрагменте на вашу фактическую команду и назвать функцию, например, repeat_ping .

Чтобы сделать его бесконечным циклом, вы можете делать то, что предлагает @Dennis. Я рекомендую вам добавить период ожидания, если вы собираетесь использовать это в интерактивной оболочке, например:

В противном случае довольно неудобно прерывать этот бесконечный цикл с помощью Ctrl-Z .

Дайте while цикла логическое условие , например следующим образом :

Это будет выполняться снова и снова, пока bash не получит сигнал о прекращении процесса. Обычно в виде ctrl+c .

Вы также можете использовать команду watch для многократного запуска скрипта. Например, простые часы в вашем bash-терминале с использованием watch могут выглядеть так:

Опция -t указывает watch не отображать название процесса, который он запускает. Это дает чистый вывод только повторяющейся команды. Опция -n1 часы повторяться каждые n секунд. В этом случае -n1 будет интервалом в 1 секунду. Затем команда date +%T показывает время на момент завершения команды. Выполнение этой команды даст вам активные часы в вашем терминале.

Это, по существу такой же , как логическое значение во while цикла только с помощью рекурсивных вызовов функций.

(edit) Для того, чтобы помнить о ресурсах вашей машины, я добавил && wait чтобы при каждом запуске процесса циклы "ожидали", пока этот процесс не завершится со статусом выхода 0 до следующей итерации. Это полезно в интерактивном сценарии оболочки.

Вы когда-нибудь были в ситуации, когда вам приходилось несколько раз запускать определенную команду Linux?

Ну, если вы еще не знаете , этот учебник научит вас, как это сделать.

Конечно, вы можете сделать это, используя скрипт оболочки или задания cron.

Кроме того, вы можете повторить команду Linux с определенным интервалом без необходимости вручную запускать ее каждый раз.

Вот где команда Watch пригодится.

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

Чтобы выразить это простыми словами, мы можем использовать команду Watch для запуска команды Linux каждые X секунд навсегда, и команда будет продолжать отображать вывод в консоли до тех пор, пока мы не остановим ее вручную, нажав CTRL + C, или убейте процесс или заставьте систему перезагрузится .

По умолчанию программа запускается каждые 2 секунды, или вы можете определить временной интервал по вашему выбору.

Запуск команды Linux каждые X секунд

Синтаксис команды watch:

Ниже я привел пять примеров, объясняющих, где вы можете использовать команду watch для повторного запуска определенных команд Linux.

Пример 1:

Скажем, вы хотите запустить команду «uptime» каждые 2 секунды, чтобы контролировать время безотказной работы вашей системы.

Для этого просто запустите:

Это будет продолжаться до тех пор, пока вы не закончите вручную.

Чтобы выйти из команды, нажмите CTRL + C.

Пример 2

Как я упоминал ранее, команда watch выполняет программу каждые 2 секунды по умолчанию.

Мы можем изменить его на определенный интервал, например 5 секунд, используя параметр -n.

Отобразим использование дискового пространства файловой системы каждые 5 секунд.

Чтобы проверить, действительно ли эта команда работает, создайте или удалите любой файл / папку.

Вы заметите, что свободное пространство изменилось на выходе после создания или удаления файлов / папок.

Чтобы просмотреть содержимое каталога, запустите:

Здесь флаг «-d или -differences» будет выделять различия между последовательными обновлениями.

Кроме того, вы можете отображать содержимое изменения каталога, которое принадлежит определенному пользователю ( например sk).

Это может быть полезно в многопользовательской системе.

Пример 4

Чтобы отобразить информацию о памяти, запустите:

Пример 5

Для отображения вывода команды du каждые 10 секунд вы можете использовать:

Это действие отслеживает использование диска каждые 10 секунд, пока вы не выйдете из режима ti вручную.

Заключение

Теперь вы знаете, как выполнять команду каждые X секунд с помощью команды «watch».

Как правило, команда Watch используется для мониторинга использования диска и использования памяти.

Не путайте эту команду с другими инструментами мониторинга.

Эта команда намеревается выполнить команду каждую конкретную секунду всегда, пока вы ее не остановите вручную.

Находим все строки в файле, которые содержат какие-либо из перечисленных шаблонов.

Используя команду GREP :

Используя команду AWK :

Используя команду SED :

Находим и печатаем строки содержащие все перечисленные паттерны.

Используя команду GREP :

Используя команду AWK :

Используя команду SED :

Находим и печатаем строки, которые не содержат указанный паттерн.

Используя команду GREP :

Используя команду AWK :

Используя команду SED :

Печать Столбцов (Колонок) в Bash с помощью AWK

С помощью примеров из данной статьи, Вы сможете решать такие распространенные задачи, как :

  • Печать Столбцов по Номерам
  • Изменять Разделители Колонок
  • Исключать Определенные Столбцы
  • Печатать или Исключать Диапазон Столбцов

Печать Столбцов по Номерам с помощью AWK

Вывести все столбцы.

Напечатать 3-ий столбец.

Напечатать 1-ый и 3-ий столбцы.

Изменить Разделитель Колонок в AWK

По умолчанию AWK, в качестве разделителя колонок, использует пробелы и табуляции.

Исключить Определенные Столбцы с помощью AWK

Напечатать все столбцы, за исключением 3-его.

Напечатать все столбцы, за исключением 1-ого и 2-ого.

Напечатать или Исключить Диапазон Столбцов с помощью AWK

Вывести колоноки со 2-ой по 4-ую.

Исключить диапазон столбцов со 2-ого по 4-ый и напечатать все остальные.

Удаление Первых и Последних Символов из Строк в Bash

Я создал файл со следующим содержимым и буду использовать его в примерах ниже. Допустим нам необходимо удалить несколько символов с начала и с конца каждой строки этого файла.

Удалить Первые N Символов Каждой Строки

Используйте следующую команду чтобы удалить первые 5 символов каждой строки (удаляем первые 5 символов и печатаем каждую строку, начиная с 6-ого символа) :

Печать Строки Между Заданными Символами

Используйте следующую команду чтобы напечатать содержимое каждой строки между 9-ым и 20-ым символами в Bash :

Печать Первых N Символов Каждой Строки

Используйте следующую команду чтобы напечатать первые 20 символовкаждой строки в Bash :

Удалить Последний Символ Каждой Строки

Используя сочетание команд reverse и cut, мы можем удалять последние N символов каждой строки, как показано ниже. (источник)
Используйте следующую команду чтобы удалить последний символ каждой строки в Bash :

Удалить Последние N Символов Каждой Строки

Используйте следующую команду чтобы удалить последние 8 символовкаждой строки в Bash :

Добавить Символ в Начале или в Конце Каждой Строки с AWK и SED

Я создал файл со следующим содержимым и буду использовать его в примерах ниже :

Допустим нам необходимо добавить символы в НАЧАЛЕ или в КОНЦЕ каждой строки этого файла.

Добавить Символы в НАЧАЛЕ Каждой Строки

Используйте следующие команды, чтобы добавить один или несколько символов в НАЧАЛЕ каждой строки файла :

Закомментировать Строки в Файле

Добавить Символы в КОНЦЕ Каждой Строки

Используйте следующие команды, чтобы добавить какой-либо текст в КОНЦЕ каждой строки файла :

Добавить Точку с Запятой в Конце Каждой Строки

Добавить Символы в НАЧАЛЕ и в КОНЦЕ Строк

Используйте следующие команды, чтобы добавить какой-либо префикс в НАЧАЛЕ и какой-либо суффикс в КОНЦЕ каждой строки файла :

Добавить Запятые и Напечатать в Одну Строку

Я часто использую следующую команду для того, чтобы добавить в конце каждой строки файла, кроме последней, по запятой, а затем вывести весь файл в одну строку :

Проверить Существует ли Файл

В процессе написания BASH скриптов, очень часто возникает ситуация, когда необходимо проверить существование файла, прежде чем предпринимать какие-либо действия.

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

Синтаксис

Основные параметры

Параметры Описание
-e Возвращает значение если файл существует
-f Возвращает значение если файл существует и это обычный файл
-r Возвращает значение если файл существует и он доступен для чтения
-w Возвращает значение если файл существует и он доступен для записи
-x Возвращает значение если файл существует и он исполняемый

Примеры

1. Проверим существует ли файл /etc/passwd и напечатаем Файл Найден, если он существует :

2. Проверим существует ли файл /etc/passwd и напечатаем Файл НЕ Найден, если он НЕ существует :

3. Проверим существование файла /etc/passwd и выполним какое-либо действие если он существует, либо иное действие, если этот файл НЕ существует :

Пример BASH Скрипта

Этот скрипт проверяет существует ли файл или нет :

Сохраните и выполните скрипт :

Напечатать Usage и Прервать Скрипт при Незаданных Аргументах

Используйте следующую проверку в shell скриптах, чтобы :

1. проверить количество входящих аргументов

3. прервать shell скрипт со статусом ошибки

Пример Bash Скрипта

Следующий скрипт использует команду dig для поиска DNS-сервера доменного имени. Проверяемый домен должен передаваться скрипту в качестве аргумента.

Пример выполнения скрипта, если аргумент не указан :

$ ./find_ns.sh
Usage: ./find_ns.sh domain_name

Базовый Синтаксис Оператора Выбора CASE

Пример BASH Скрипта с Оператором CASE

Примеры работы скрипта :
$ ./testcase.sh
Какой Linux дистрибутив Вы знаете? centos
Эй! Это моя любимая серверная операционная система!
$ ./testcase.sh
Какой Linux дистрибутив Вы знаете? rhel
Эй! Это моя любимая серверная операционная система!
$ ./testcase.sh
Какой Linux дистрибутив Вы знаете? ubuntu
Я тоже знаю ubuntu! Это операционная система, основанная на Debian.
$ ./testcase.sh
Какой Linux дистрибутив Вы знаете? pfff
Хмм, кажется я никогда не использовал этот дистрибутив.

В bash скриптах очень часто возникает необходимость приостановить выполнение задачи и поставить пользователю вопрос, на который тот должен ответить Да или Нет.

Запрос о Продолжении в Bash

Иногда возникает необходимость несколько раз выполнить одну и ту же команду из командной строки в Linux.

В Bash существует простая конструкция, с помощью которой команду можно прописать один раз, но сделать так, чтобы она была выполнена N раз.

Повторить Команду Несколько Раз в Linux Shell

Используйте следующий синтаксис, чтобы выполнить какую-либо команду 5 раз :

Давайте поможем Барту Симпсону со школьной доской :

Если вам необходимо часто использовать такую конструкцию, тогда не помешает создать соответствующую Bash функцию (добавьте в

Думаю вы сталкивались когда с проблемой что должны запустить одну или другую команду в определённое время или каждые x секунд. В сегодняшней статье мы поговорим именно о такой команде в Linux которая дает возможность это сделать. Используйте её по вашему усмотрению, дома или на работе, в принципе как вам удобно.

Команда Watch

Команда Watch является командой Linux которая дает возможность запускать любую программу или осуществить повтор команд в Linux периодически или в интервале в несколько секунд, а также показывает вам действия на экране. Интервал запуска может быть изменен по вашим критериям.

3 января стартует курс «SQL-injection Master» © от команды The Codeby

За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

Запись на курс до 10 января. Подробнее .

Запуск и повтор

Watch очень прост в использовании, допустим вы хотите запустить какой-то фаил программу или скрипт с интервалом в 5 секунд.

-n ( Определяет интервал запуска. В нашем случае file.sh будет запускаться каждые 5 секунд )
Параметр легко может быть изменен по вашим нуждам всего лишь изменяя цифру после -n .

Будьте внимательны . Минимальное время запуска не может быть меньше 0.1 сек.

Также вы можете запускать и моторизировать любые программы с помощью этой команды.

К примеру вы хотите запустить свободную программу:

Надеюсь Watch избавит вас от многих проблем с запуском или мониторингом чего там вам угодно.

1 декабря стартует зимний поток курса " Тестирование Веб-Приложений на проникновение " от команды codeby . Общая теория, подготовка рабочего окружения, пассивный фаззинг и фингерпринт, активный фаззинг, уязвимости, пост-эксплуатация, инструментальные средства, Social Engeneering и многое другое. На курс можно записаться до 10 декабря включительно. Подробнее .

В прошлый раз мы рассказали об основах программирования для bash. Даже то немногое, что уже разобрано, позволяет всем желающим приступить к автоматизации работы в Linux. В этом материале продолжим рассказ о bash-скриптах, поговорим об управляющих конструкциях, которые позволяют выполнять повторяющиеся действия. Речь идёт о циклах for и while , о методах работы с ними и о практических примерах их применения.

image


Внимание: в посте спрятана выгода!

Циклы for

Оболочка bash поддерживает циклы for , которые позволяют организовывать перебор последовательностей значений. Вот какова базовая структура таких циклов:


В каждой итерации цикла в переменную var будет записываться следующее значение из списка list . В первом проходе цикла, таким образом, будет задействовано первое значение из списка. Во втором — второе, и так далее — до тех пор, пока цикл не дойдёт до последнего элемента.

Перебор простых значений

Пожалуй, самый простой пример цикла for в bash-скриптах — это перебор списка простых значений:


Ниже показаны результаты работы этого скрипта. Хорошо видно, что в переменную $var последовательно попадают элементы из списка. Происходит так до тех пор, пока цикл не дойдёт до последнего из них.



Простой цикл for

Обратите внимание на то, что переменная $var сохраняет значение при выходе из цикла, её содержимое можно менять, в целом, работать с ней можно как с любой другой переменной.

Перебор сложных значений

В списке, использованном при инициализации цикла for , могут содержаться не только простые строки, состоящие из одного слова, но и целые фразы, в которые входят несколько слов и знаков препинания. Например, всё это может выглядеть так:


Вот что получится после того, как этот цикл пройдётся по списку. Как видите, результат вполне ожидаем.



Перебор сложных значений
TNW-CUS-FMP — промо-код на 10% скидку на наши услуги, доступен для активации в течение 7 дней"

Инициализация цикла списком, полученным из результатов работы команды

Ещё один способ инициализации цикла for заключается в передаче ему списка, который является результатом работы некоей команды. Тут используется подстановка команд для их исполнения и получения результатов их работы.


В этом примере задействована команда cat , которая читает содержимое файла. Полученный список значений передаётся в цикл и выводится на экран. Обратите внимание на то, что в файле, к которому мы обращаемся, содержится список слов, разделённых знаками перевода строки, пробелы при этом не используются.



Цикл, который перебирает содержимое файла

Тут надо учесть, что подобный подход, если ожидается построчная обработка данных, не сработает для файла более сложной структуры, в строках которого может содержаться по несколько слов, разделённых пробелами. Цикл будет обрабатывать отдельные слова, а не строки.

Что, если это совсем не то, что нужно?

Разделители полей

Причина вышеописанной особенности заключается в специальной переменной окружения, которая называется IFS (Internal Field Separator) и позволяет указывать разделители полей. По умолчанию оболочка bash считает разделителями полей следующие символы:

  • Пробел
  • Знак табуляции
  • Знак перевода строки

Для того, чтобы решить проблему, можно временно изменить переменную среды IFS . Вот как это сделать в bash-скрипте, если исходить из предположения, что в качестве разделителя полей нужен только перевод строки:


После добавления этой команды в bash-скрипт, он будет работать как надо, игнорируя пробелы и знаки табуляции, считая разделителями полей лишь символы перевода строки.


Если этот скрипт запустить, он выведет именно то, что от него требуется, давая, в каждой итерации цикла, доступ к очередной строке, записанной в файл.



Построчный обход содержимого файла в цикле for

Разделителями могут быть и другие символы. Например, выше мы выводили на экран содержимое файла /etc/passwd . Данные о пользователях в строках разделены с помощью двоеточий. Если в цикле нужно обрабатывать подобные строки, IFS можно настроить так:

Обход файлов, содержащихся в директории

Один из самых распространённых вариантов использования циклов for в bash-скриптах заключается в обходе файлов, находящихся в некоей директории, и в обработке этих файлов.

Например, вот как можно вывести список файлов и папок:


Если вы разобрались с предыдущим материалом из этой серии статей, вам должно быть понятно устройство конструкции if-then , а так же то, как отличить файл от папки. Если вам сложно понять вышеприведённый код, перечитайте этот материал.

Вот что выведет скрипт.



Вывод содержимого папки

Обратите внимание на то, как мы инициализируем цикл, а именно — на подстановочный знак «*» в конце адреса папки. Этот символ можно воспринимать как шаблон, означающий: «все файлы с любыми именами». он позволяет организовать автоматическую подстановку имён файлов, которые соответствуют шаблону.

При проверке условия в операторе if , мы заключаем имя переменной в кавычки. Сделано это потому что имя файла или папки может содержать пробелы.

Циклы for в стиле C

Если вы знакомы с языком программирования C, синтаксис описания bash-циклов for может показаться вам странным, так как привыкли вы, очевидно, к такому описанию циклов:


В bash-скриптах можно использовать циклы for , описание которых выглядит очень похожим на циклы в стиле C, правда, без некоторых отличий тут не обошлось. Схема цикла при подобном подходе выглядит так:


На bash это можно написать так:


А вот рабочий пример:


Этот код выведет список чисел от 1 до 10.



Работа цикла в стиле C

Цикл while

Конструкция for — не единственный способ организации циклов в bash-скриптах. Здесь можно пользоваться и циклами while . В таком цикле можно задать команду проверки некоего условия и выполнять тело цикла до тех пор, пока проверяемое условие возвращает ноль, или сигнал успешного завершения некоей операции. Когда условие цикла вернёт ненулевое значение, что означает ошибку, цикл остановится.

Вот схема организации циклов while
while команда проверки условия
do
другие команды
done

Взглянем на пример скрипта с таким циклом:


На входе в цикл проверяется, больше ли нуля переменная $var1 . Если это так, выполняется тело цикла, в котором из значения переменной вычитается единица. Так происходит в каждой итерации, при этом мы выводим в консоль значение переменной до его модификации. Как только $var1 примет значение 0, цикл прекращается.



Результат работы цикла while

Если не модифицировать переменную $var1 , это приведёт к попаданию скрипта в бесконечный цикл.

Вложенные циклы

В теле цикла можно использовать любые команды, в том числе — запускать другие циклы. Такие конструкции называют вложенными циклами:


Ниже показано то, что выведет этот скрипт. Как видно, сначала выполняется первая итерация внешнего цикла, потом — три итерации внутреннего, после его завершения снова в дело вступает внешний цикл, потом опять — внутренний.



Вложенные циклы

Обработка содержимого файла

Чаще всего вложенные циклы используют для обработки файлов. Так, внешний цикл занимается перебором строк файла, а внутренний уже работает с каждой строкой. Вот, например, как выглядит обработка файла /etc/passwd :


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



Обработка данных файла

Такой подход можно использовать при обработке файлов формата CSV, или любых подобных файлов, записывая, по мере надобности, в переменную окружения IFS символ-разделитель.

Управление циклами

Возможно, после входа в цикл, нужно будет остановить его при достижении переменной цикла определённого значения, которое не соответствует изначально заданному условию окончания цикла. Надо ли будет в такой ситуации дожидаться нормального завершения цикла? Нет конечно, и в подобных случаях пригодятся следующие две команды:

Команда break

Эта команда позволяет прервать выполнение цикла. Её можно использовать и для циклов for , и для циклов while :


Такой цикл, в обычных условиях, пройдётся по всему списку значений из списка. Однако, в нашем случае, его выполнение будет прервано, когда переменная $var1 будет равна 5.



Досрочный выход из цикла for

Вот — то же самое, но уже для цикла while :


Команда break , исполненная, когда значение $var1 станет равно 5, прерывает цикл. В консоль выведется то же самое, что и в предыдущем примере.

Команда continue

Когда в теле цикла встречается эта команда, текущая итерация завершается досрочно и начинается следующая, при этом выхода из цикла не происходит. Посмотрим на команду continue в цикле for :


Когда условие внутри цикла выполняется, то есть, когда $var1 больше 5 и меньше 10, оболочка исполняет команду continue . Это приводит к пропуску оставшихся в теле цикла команд и переходу к следующей итерации.



Команда continue в цикле for

Обработка вывода, выполняемого в цикле

Данные, выводимые в цикле, можно обработать, либо перенаправив вывод, либо передав их в конвейер. Делается это с помощью добавления команд обработки вывода после инструкции done .

Например, вместо того, чтобы показывать на экране то, что выводится в цикле, можно записать всё это в файл или передать ещё куда-нибудь:


Оболочка создаст файл myfile.txt и перенаправит в этот файл вывод конструкции for . Откроем файл и удостоверимся в том, что он содержит именно то, что ожидается.



Перенаправление вывода цикла в файл

Пример: поиск исполняемых файлов

Давайте воспользуемся тем, что мы уже разобрали, и напишем что-нибудь полезное. Например, если надо выяснить, какие именно исполняемые файлы доступны в системе, можно просканировать все папки, записанные в переменную окружения PATH . Весь арсенал средств, который для этого нужен, у нас уже есть, надо лишь собрать всё это воедино:


Такой вот скрипт, небольшой и несложный, позволил получить список исполняемых файлов, хранящихся в папках из PATH .



Поиск исполняемых файлов в папках из переменной PATH

Итоги

Сегодня мы поговорили о циклах for и while в bash-скриптах, о том, как их запускать, как ими управлять. Теперь вы умеете обрабатывать в циклах строки с разными разделителями, знаете, как перенаправлять данные, выведенные в циклах, в файлы, как просматривать и анализировать содержимое директорий.

Читайте также: