Как использовать PGrep & amp; Команды PKill

Команда grep используется для поиска определенной строки или шаблона.

Самый простой способ убить процессы с помощью Linux

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

В рамках наших «5 способов убить программу Linux» мы познакомили вас с командой PKill, и в этом руководстве мы расширим использование и доступные ключи для команды PKill.

PKill

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

термин pkill

Вы можете вернуть счетчик количества завершенных процессов, указав ключ -c следующим образом:

pkill -c

Выходными данными будет просто количество уничтоженных процессов.

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

pkill -u

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

id -u

Например:

id -u gary

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

pkill -U

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

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

id -ru

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

pkill -g pkill -G

Команды Linux для работы с директориями и файлами

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

2.1 Файлы и директории

# pwd # Выводится текущий путь; # ls # Выводится список каталогов и файлов по порядку; # ls -laX # Выводится отформатированный список всех директорий и файлов, в том числе скрытых; # cd # Для перехода в домашнюю директорию; # cd /home # Для перехода в директорию /home; # touch /home/primer2 # Создаётся пустой файл /home/primer2; # tail /var/log/messages # Выводится конец файла. Это удобно, если вы работе с большими файлами и логами; # cat /home/primer2 # Показывается содержимое файла; # nano /home/primer2 # Обеспечивается редактирование файла; # gedit /home/primer2 # Ещё одна Linux-команда для редактирования файла; # echo "Последняя строчка" | sudo tee -a /home/primer2 # К концу файла добавляется "Последняя строчка"; # cp /home/[email protected]/ /home/ # Копируется /home/[email protected]/ в home/; # mkdir /home/[email protected]/shaman # Создаётся директория с именем shaman; # rmdir /home/[email protected]/shaman # Удаляется директория с именем shaman; # rm -rf /home/[email protected]/shaman # Удаляется директория со вложенными фалами; # ln -s /home/[email protected]/ /home/primer # Cоздаётся символическая ссылка к файлу /home/[email protected]/; # cp -la /dir1 /dir2 # Для копирования директории; # mv /dir1 /dir2 # Для переименовывания директории; # du -sh /home/[email protected]/ # На экран выводится размер заданной директории. Команда подходит и для определения размера файлов; # locate primer # Выполняется поиск файлов с именем primer.

2.2 Права доступа

# [sudo] chmod 0777 /home/ # Меняются права доступа к директории. В данном случае 0777 – это разрешение на чтение/запись/исполнение для всех групп; # [sudo] chown [email protected]:ITShaman /home/ # Меняются владелец и группы, но только для файла /home/; # [sudo] chmod -R 0777 /home/ # Происходит рекурсивное изменение прав доступа к директории. Значение 0777 мы уже описали выше. Права 0777 будут иметь все вложенные файлы и директории; # [sudo] chown -R [email protected] /home/ # Для всего содержимого директории меняется владелец.

Поиск по регулярному выражению в grep

Это всё, конечно, замечательно, но я бы хотел при поиске определения функции искать именно определение функции, без указания файлов, где она только упоминается. То есть мне нужна строка, где будет тип возвращаемого значения (char*), после которого будет идти какое-то количество спец-слов и пробелов, а потом название функции. Нет ничего проще:

grep -r -C 3 -E ‘char.*?\*.*?SDL_GetError’ /usr/local/include

Почти все ключи нам известны кроме -E – он включает режим расширенных регулярных выражений для шаблона поиска. Так в данном регулярном выраженнии мы написали ‘char.?*.?SDL_GetError’ то есть:

  • в строке должная встретиться подстрока «char»,
  • сразу за ней должны встретиться любые символы до «*». Тут важно сказать, что . в регулярных выражениях отвечает за любой символ, * – модификатор, указывающий количество: от 0 до бесконечности повторений. Далее идёт ? – ограничитель жадности: да, любое количество повторений, пока не встретишь следующее из регулярного выражения.
  • \* – мы уже знаем, что * – спец. символ, означающий любое количество повторений. Поэтому, чтобы указать, что здесь должна быть просто *, мы используем экранирующий символ – \. Им же мы можем указать, что нужен символ «точка» или «вопросительный знак», не указывая на их дополнительные символы в рамках данного диалекта регулярных выражений.
  • снова .*? – съедаем все символы, не относящиеся к далее идущим в регулярке.
  • ну и наша функция «SDL_GetError».

Схематично это можно выразить следующим образом:

| char | .*? | \* | .*? | SDL_GetError | extern DECLSPEC | char | | * | SDLCALL | SDL_GetError | (void);

Регулярные выражения – отнюдь не очевидная тема. И понять её с ходу вы вряд лм сможете. Я подготовил некоторое объяснение в рамках второй пары по Linux. Но явно нужно более тщательное рассмотрение этой темы.

Как отправлять сигналы процессам в Linux

Все процессы в Linux отвечают на сигналы.

Сигналы — способ завершить или изменить поведение программ на уровне ОС.

Как отправлять процессам сигналы при помощи PID

Наиболее распространенным способом передачи сигналов программам является команда kill.

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

kill PID_of_target_process

Это отправит всем процессам сигнал TERM. Данный сигнал приказывает процессу завершиться. Это позволяет программе выполнять операции по очистке и завершить работу без помех.

Если программа неисправна и не завершает работу при отправке сигнала TERM, можно усилить сигнал, передав сигнал KILL:

kill -KILL PID_of_target_process

Данный специальный сигнал отправляется не программе.

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

Каждый сигнал имеет ассоциированный номер, который можно передать вместо имени. К примеру, можно отправить «-15» вместо «-TERM» и «-9» вместо «-KILL».

Как использовать сигналы для других целей

Сигналы используются не только для завершения работы программ. Они также полезны для совершения других действий.

К примеру, многие демоны можно перезапустить при помощи сигнала отбоя HUP. Apache является одной из работающих по такому принципу программ.

sudo kill -HUP pid_of_apache

Вышеприведенная команда заставит Apache перезагрузить конфигурационный файл и возобновить обслуживание контента.

Чтобы просмотреть список всех сигналов, которые можно отправить с kill, наберите:

kill -l

Как отправлять сигналы процессам по имени

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

Как отправлять сигналы процессам в Linux

Команда pkill работает почти также, как kill, но она действует от имени процесса:

pkill -9 ping

Команда, приведенная выше, является эквивалентом:

kill -9 `pgrep ping`

Чтобы послать сигнал каждому экземпляру определенного процесса, используйте команду killall:

killall firefox

Вышеуказанная команда отправит сигнал TERM каждому экземпляру firefox, запущенному на данном компьютере.

Как установить приоритеты процессов

Часто возникает необходимость установить, какие процессы имеют приоритет в серверной среде.

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

Linux контролирует приоритеты с помощью значения под названием niceness.

Задачи с высоким приоритетом имеют низшее значение  nice, так как они поглощают ресурсы. С другой стороны, задачи с низким приоритетом имеют высокое значение nice, так как они используют минимальное количество ресурсов.

При запуске команды top в начале статьи был выведен столбец, отмеченный как «NI». В нем указывается значение nice процесса:

top

В зависимости от системы, значение nice может варьироваться от «-19/-20» (наивысший приоритет) до «19/20» (самый низкий приоритет).

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

nice -n 15 command_to_execute

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

Чтобы изменить значение nice программы, которая уже выполняется, нужно использовать инструмент renice:

renice 0 PID_to_prioritize

Примечание: в то время как nice работает с именем команды, renice вызывает PID процесса.

Оператор NOT (!)

Оператор NOT (!) очень похож на оператор «кроме«. Эта команда выполнит все, кроме предоставленного условия. Чтобы понять как это работает, создайте каталог «sedicomm» в вашем домашнем каталоге и перейдите к нему с помощью команды «cd«.

Читайте также:  Linux Fu. Завершение пользовательских команд Bash

mkdir sedicomm cd sedicomm

Затем создайте несколько типов файлов в папке «sedicomm».

touch

Смотрите, мы создали все новые файлы в папке «sedicomm».

ls

Теперь удалите все файлы, за исключением файла «html»одновременно, умным способом.

rm -r !(*.html)

Просто чтобы проверить, последнее исполнение. Перечислите все доступные файлы с помощью команды ls.

ls

Выражения в квадратных скобках и Классы символов

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

grep -h ‘zip’ dirlist*.txt bzip2 bzip2recover gzip

мы найдём любые строчки, содержащие строки «bzip» или «gzip».

Набор может содержать любое количество символов, а метасимволы теряют своё специальное значение, когда помещаются внутрь квадратных скобок. Тем не менее, есть два случая в которых метасимволы, используемые внутри квадратных скобок, имеют различные значения. Первый – это каретка (^), которая используется для указания отрицания; второй – это тире (-), которое используется для указания диапазона символов.

Отрицание

Если первым символом выражения в квадратных скобках является каретка (^), то остальные символы принимаются как набор символов, которые не должны присутствовать в заданной позиции символа. Сделаем это изменив наш предыдущий пример:

grep -h ‘zip’ dirlist*.txt bunzip2 gunzip funzip gpg-zip mzip p7zip preunzip prezip prezip-bin unzip unzipsfx

С активированным отрицанием, мы получили список файлов, которые содержат строку «zip», перед которой идёт любой символ, кроме «b» или «g»

Читайте также:  Что добавят в iOS 14 и когда её покажут?

Обратите внимание, что zip не был найден. Отрицаемый набор символов всё равно требует символ на заданной позиции, но символ не должен быть членом инвертированного набора.

Символ каретки вызывает отрицание только если он является первым символом внутри выражения в квадратных скобках; в противном случае, он теряет своё специальное назначение и становится обычным символом из набора.

Традиционные диапазоны символов

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

grep -h ‘^’ dirlist*.txt MAKEDEV GET HEAD POST VBoxClient X X11 Xorg ModemManager NetworkManager VBoxControl VBoxService

Суть в том, что мы разместили все 26 заглавных букв в выражение внутри квадратных скобок. Но мысль печатать их все не вызывает энтузиазма, поэтому есть другой путь:

grep -h ‘^’ dirlist*.txt

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

grep -h ‘^’ dirlist*.txt

В диапазонах символов мы видим, что символ чёрточки трактуется особым образом, поэтому как мы можем включить символ тире в выражение внутри квадратных скобок? Сделав его первым символом в выражении. Рассмотрим два примера:

grep -h » dirlist*.txt

Это будет соответствовать каждому имени файла, содержащему заглавную букву. При этом:

grep -h » dirlist*.txt

будет соответствовать каждому имени файла, содержащему тире, или заглавную «A», или заглавную «Z».

Классы символов POSIX

Подробнее о POSIX вы можете почитать в Википедии.

В POSIX имеются свои классы символов, которые вы можете использовать в регулярных выражениях:

Класс символов Описание
Алфавитно-цифровые символы. В ASCII эквивалентно:
То же самое, что и , с дополнительным символом подчёркивания (_).
Алфавитные символы. В ASCII эквивалентно:
Включает символы пробела и табуляции.
Управляющие коды ASCII. Включает ASCII символы с 0 до 31 и 127.
Цифры от нуля до девяти.
Видимые символы. В ASCII сюда включены символы с 33 по 126.
Буквы в нижнем регистре.
Символы пунктуации. В ASCII эквивалентно: [-!»#$%&'()*+,./:;[email protected]_`{|}~]
Печатные символы. Все символы в плюс символ пробела.
Символы белых пробелов, включающих пробел, табуляцию, возврат каретки, новую строку, вертикальную табуляцию и разрыв страницы. В ASCII эквивалентно:
Символы в верхнем регистре.
Символы, используемые для выражения шестнадцатеричных чисел. В ASCII эквивалетно:

В этих выражениях квадратные скобки и двоеточия являются частью записи класса символов (диапазонов).

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

может соответствовать не , а .