Управление процессами в linux

Сбой

Это случается не часто, но когда происходит сбой программы, это может сильно раздражать. Допустим, у нас работает наш браузер, и он неожиданно блокируется. Вы пытаетесь закрыть окно, но ничего не происходит. Не беспокойтесь, мы можем «закрыть» Firefox и снова открыть его. Для начала нам нужно идентифицировать процесс.

Это номер рядом с владельцем процесса, который является ID процесса.

kill

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

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

Не беспокойтесь, мы снова можем закрыть, но на этот раз подаем сигнал 9.

Блокировка рабочего стола

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

Большую часть времени мы видим только консоль которая является графическим интерфейсом, но мы можем легко добраться до остальных. Если GUI заблокирован, можно добраться до другой консоли и оттуда отменить процесс, вызывающий нарушение. Для переключения между консолями вы используете последовательность клавиш CTRL + ALT + F <Console>.

Таким образом, CTRL + ALT F2 приведет вас к консоли, где вы можете запускать команды, как указано выше, чтобы идентифицировать процессы и отменить их.

Затем CTRL + ALT F7 вернет вас в графический интерфейс, чтобы увидеть, было ли это исправлено. Общий подход заключается в том, чтобы сохранить процессы отмены, пока не будет устранена блокировка.

Обычно вы можете искать такие признаки, как высокая загрузка ЦП или памяти, и начинать сначала с этих процессов. Иногда этот подход работает, иногда нет, и вам нужно перезагрузить компьютер.

Пример использования команды Nohup

Выполнение скрипта с помощью nohup так же просто, как это.

nohup ./nhp.sh

Обратите внимание, что nohup не развил процесс в фоновом режиме. Nohup предназначен только для перехвата сигналов SIGHUP. После запуска команды вы можете продолжить и закрыть свой терминал. Он предупредит вас, что процесс запущен. Подтвердите, что хотите убить его.
Когда вы закрыли свой терминал, все дочерние процессы получили сигнал SIGHUP. Nohup помешал этому сигналу достичь нашей команды. На следующем рисунке показана информация о нашей команде, пока терминал еще работал.
Вы видите PPID? Это идентификатор родительского процесса. Когда вы запросили закрыть терминал, все дочерние элементы PPID получили сигнал SIGHUP. Nohup не дал этому сигналу дойти до нашего сценария. Родительский процесс завершен, и наш сценарий осиротел. Когда процесс становится осиротевшим, он автоматически получает 1 (systemd или init) в качестве родителя.
Как видите, продемонстрировать использование nohup не сложно. Очень простая команда. Вы можете разветвлять процесс в фоновом режиме следующим образом:

nohup ./nhp.sh &

Вы также можете решить, куда будет перенаправлен вывод:

nohup ./nhp.sh >/path/to/file &

Обратите внимание, что если вы выключите или перезагрузите систему Linux, она убьет команду. Когда вы запрашиваете завершение работы или перезагрузку, все процессы получают SIGTERM, а затем SIGKILL . Эти сигналы не будут перехвачены Nohup

Что такое команда nohup?

Nohup можно рассматривать как обертку. Префикс вашей команды с nohup:

nohup COMMAND ARGS ....

Цель Nohup в том чтобы перехватить и предотвратить SIGHUP сигналы от достижения команды.

Когда вы префиксируете свою команду nohup, ввод будет перенаправлен из нечитаемого файла ( nohup COMMAND </dev/null ). Проще говоря, не вызывайте команду с nohup, если вам нужно отправить входные данные для этой команды. Когда вы запускаете команду Nohup, он должен быть в состоянии работать без присмотра.

Nohup сначала попытается перенаправить вывод в ./nohup.out или отправит его в ~/nohup.out, если это будет необходимо. Вы также можете решить, куда перенаправить вывод следующим образом:

nohup COMMANDS >/path/to/output/file

О nohup говорить особо нечего, у него нет длинного списка опций. Есть только –help и –version.

Kill Command in Linux

21 Января 2020
&vert;

Терминал

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

команда

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

Используйте команду для отображения всех мест в вашей системе, содержащих :

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

Синтаксис команды принимает следующую форму:

Команда отправляет сигнал указанным процессам или группам процессов, заставляя их действовать в соответствии с сигналом. Если сигнал не указан, по умолчанию используется значение (-TERM).

Наиболее часто используемые сигналы:

  • () — Перезагрузить процесс.
  • () — убить процесс.
  • () — Изящно остановить процесс.

   Чтобы получить список всех доступных сигналов, вызовите команду с опцией:

Сигналы могут быть указаны тремя различными способами:

  1. Используя номер (например, или ).
  2. Используя префикс «SIG» (например, или ).
  3. Без префикса «SIG» (например, или ).

   Следующие команды эквивалентны друг другу:

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

  • Если больше нуля, сигнал отправляется процессу с идентификатором, равным .
  • Если равно нулю, сигнал отправляется всем процессам в текущей группе процессов. Другими словами, сигнал отправляется всем процессам, принадлежащим GID оболочки, которая вызвала команду. Используйте команду для просмотра идентификаторов группы процессов (GID).
  • Если равно , сигнал отправляется всем процессам с тем же UID, что и пользователь, вызывающий команду. Если вызывающий пользователь является пользователем root, сигнал отправляется всем процессам, кроме init и самого процесса.
  • Если меньше чем , сигнал отправляется всем процессам в группе процессов eq с GID, равным абсолютному значению .

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

Завершение процессов с помощью команды

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

Допустим, браузер Firefox перестал отвечать на запросы, и вам нужно завершить процесс Firefox. Чтобы найти PID браузера, используйте команду:

   Команда напечатает идентификаторы всех процессов Firefox:

Как только вы узнаете номера процессов, вы можете прекратить их все, отправив сигнал:

   Вместо того, чтобы искать PID и затем завершать процессы, вы можете объединить вышеуказанные команды в одну:

Перезагрузка процессов с помощью команды

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

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

Используйте команду, чтобы найти главный PID:

   Как только вы найдете главный PID, перезагрузите настройки Nginx, набрав:

   Приведенная выше команда должна выполняться от имени пользователя root или пользователя с привилегиями sudo .

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

Ограничение процессов

Управление процессами в Linux позволяет контролировать практически все. Вы уже видели что можно сделать, но можно еще больше. С помощью команды ulimit и конфигурационного файла /etc/security/limits.conf вы можете ограничить процессам доступ к системным ресурсам, таким как память, файлы и процессор. Например, вы можете ограничить память процесса Linux, количество файлов и т д.

Запись в файле имеет следующий вид:

<домен> <тип> <элемент> <значение>

  • домен — имя пользователя, группы или UID
  • тип — вид ограничений — soft или hard
  • элемент — ресурс который будет ограничен
  • значение — необходимый предел

Жесткие ограничения устанавливаются суперпользователем и не могут быть изменены обычными пользователями. Мягкие, soft ограничения могут меняться пользователями с помощью команды ulimit.

Рассмотрим основные ограничения, которые можно применить к процессам:

  • nofile — максимальное количество открытых файлов
  • as — максимальное количество оперативной памяти
  • stack — максимальный размер стека
  • cpu — максимальное процессорное время
  • nproc — максимальное количество ядер процессора
  • locks — количество заблокированных файлов
  • nice — максимальный приоритет процесса

Например, ограничим процессорное время для процессов пользователя sergiy:

Посмотреть ограничения для определенного процесса вы можете в папке proc:

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

Вот опции команды:

  • -S — мягкое ограничение
  • -H — жесткое ограничение
  • -a — вывести всю информацию
  • -f — максимальный размер создаваемых файлов
  • -n — максимальное количество открытых файлов
  • -s — максимальный размер стека
  • -t — максимальное количество процессорного времени
  • -u — максимальное количество запущенных процессов
  • -v — максимальный объем виртуальной памяти

Например, мы можем установить новое ограничение для количества открываемых файлов:

Теперь смотрим:

Установим лимит оперативной памяти:

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

Запуск фонового процесса в Linux

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

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

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

Вы также можете отправить процесс в фоновый режим, приостановив его с помощью сочетания клавиш Ctrl+Z. Данное сочетание клавиш отправит процессу сигнал , тем самым переведя его в режим ожидания:

Чтобы продолжить выполнение вышеупомянутой приостановленной команды в фоновом режиме, используйте команду bg (от англ. «begin»):

Чтобы отправить фоновый процесс на передний план, используйте команду fg (от англ. «foreground») вместе с идентификатором задания следующим образом:

Настройка приоритетов процессов

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

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

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

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

Когда мы запускали команду в начале этого учебного модуля, мы видели столбец “NI”. В этом столбце отображается значение вежливости процесса:

В зависимости от системы, значения вежливости могут различаться от “-19/-20” (наибольший приоритет) до “19/20” (наименьший приоритет).

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

<pre>nice -n 15 <span class=“highlight”>commandtoexecute</span></pre>

Это работает только в начале новой программы.

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

<pre>renice 0 <span class=“highlight”>PIDtoprioritize</span></pre>

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

Разница между процессом и программой:

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

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

Родительский процесс и дочерний процесс:

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

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

3, Родительский процесс завершается, а дочерний процесс завершается естественным образом.

Фоновый режим

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

Мы продемонстрируем это с помощью программы sleep . Все, что нужно сделать, — это подождать определенное количество секунд, а затем выйти. Мы также можем использовать программу, называемую jobs, которая перечисляет текущие фоновые задания для нас.

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

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

Мы также можем перемещать задания между передним и задним планами. Если вы нажмете CTRL + z, то текущий процесс переднего плана будет приостановлен и перемещен в фон. Затем мы можем использовать программу под названием fg.

Сигналы как часть завершения процесса

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

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

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

Стоит отметить, что процессы в ОС «Линукс» могут реагировать не на все сигналы. Рекомендуется рассмотреть максимально подробно те, которые применяются при завершении процессов:

  • SIGINT. Этот сигнал является самым безобидным. Он будет отправлен процессу, который запущен из терминала путем сочетания клавиш «Ctrl+C». Процесс будет завершен правильно, а управление возвращается к пользователю.
  • SIGQUIT. Такой сигнал также отправляется путём сочетания клавиш, но распространяется на программу, запущенную в самом терминале. Сигнал сообщит ей, что необходимо срочное завершение. В данном случае программа корректно завершится или просто проигнорирует сигнал. Главное отличие от вышеописанного варианта – процесс сопровождается генерированием дампа памяти. Здесь используется сочетание клавиш «Ctrl+/».
  • SIGHUP. Данный сигнал сообщит определенному процессу, что соединение с терминалом управления прервано. Он отправляется не пользователем, а самой системой. Сигнал может возникнуть при закрытии доступа к интернету.
  • SIGTERM. Этот сигнал свидетельствует о немедленном завершении процессов, но обрабатывается с помощью специальных программ. Именно поэтому появляется возможность устранения всех дочерних процессов, освобождения ресурсов.
  • SIGKILL. Такой сигнал также немедленно завершает процессы. Главное отличие от предыдущего варианта – сигнал передаётся не на сам процесс, а на ядро, где в последующем обрабатывается. В этом случае ресурсы и дочерние процессы не завершаются в принудительном порядке.

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

3.3. Корректная процедура выполнения практического задания: фоновые процессы

1. Используйте команду jobs , чтобы удостовериться в том, что никакие процессы не выполняются в фоновом режиме.

jobs (возможно одни из процессов cat все еще исполняется?)

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

(в процессе работы с vi нажмите ctrl-z)

3. Используйте команду jobs , чтобы убедиться в том, что исполнение процесса vi в фоновом режиме остановлено.

4. Выполните команду find / > allfiles.txt 2>/dev/null в фоновом режиме. Остановите исполнение этой команды в фоновом режиме перед тем, как будет закончен обход файловой системы.

5. Запустите два процесса sleep с длительным периодом ожидания в фоновом режиме.

6. Выведите информацию обо всех задачах , исполняющихся в фоновом режиме.

7. Используйте утилиту kill для остановки исполнения одного из процессов с именем sleep .

8. Инициируйте продолжение исполнения процесса find в фоновом режиме (убедитесь в том, что исполнение продолжилось).

bg 2 (проверьте состояние задачи с указанным идентификатором в списке фоновых задач)

9. Переведите один из процессов с именем sleep назад в текущую командную оболочку.

fg 3 (и снова проверьте состояние задачи с указанным идентификатором в списке фоновых задач)

10. (Общий вопрос, ответ может быть дан при наличии свободного времени. ) Дайте детальные пояснения по поводу источников чисел из следующего примера. В каких условиях переменные заменяются на их значения? Какая командная оболочка осуществляет эту замену?

Текущая командная оболочка bash будет заменять имена переменных $$ и $PPID при разборе строки команды перед исполнением команды echo.

Теперь имена переменных экранированы с помощью двойных кавычек, но текущая командная оболочка bash все также будет заменять имена переменных $$ и $PPID при разборе строки команды перед исполнением команды bash -c.

А теперь имена переменных экранированы с помощью одинарных кавычек. Текущая командная оболочка bash не будет заменять имена переменных $$ и $PPID. Команда bash -c будет выполнена перед заменой имен переменных на их значения. Вторая же командная оболочка bash будет осуществлять замену имен переменных $$ и $PPID на их значения.

При использовании обратных кавычек командная оболочка все также будет осуществлять замену имен переменных на их значения перед исполнением встроенной команды echo. Результатом исполнения этой команды echo будут являться идентификаторы двух процессов. Эти идентификаторы будут переданы команде bash -c. Но эти два числа не являются корректными командами!

Альтернативы

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

Screen

Экран или GNU Screen — это программа-мультиплексор терминала, которая позволяет запускать сеанс экрана и открывать любое количество окон (виртуальных терминалов) внутри этого сеанса. Процессы, запущенные в Screen, будут продолжать работать, если их окно не отображается, даже если вы отключитесь.

Tmux

Tmux — это современная альтернатива экрану GNU. С помощью Tmux вы также можете создать сеанс и открыть несколько окон внутри этого сеанса. Сеансы Tmux являются постоянными, что означает, что программы, запущенные в Tmux, будут продолжать работать, даже если вы закроете терминал.

disown

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

Что такое команда nohup?

Nohup можно рассматривать как обертку. Префикс вашей команды с nohup:

Цель Nohup в том чтобы перехватить и предотвратить SIGHUP сигналы от достижения команды.

Когда вы префиксируете свою команду nohup, ввод будет перенаправлен из нечитаемого файла ( nohup COMMAND </dev/null ). Проще говоря, не вызывайте команду с nohup, если вам нужно отправить входные данные для этой команды. Когда вы запускаете команду Nohup, он должен быть в состоянии работать без присмотра.

Nohup сначала попытается перенаправить вывод в ./nohup.out или отправит его в ~/nohup.out, если это будет необходимо. Вы также можете решить, куда перенаправить вывод следующим образом:

О nohup говорить особо нечего, у него нет длинного списка опций. Есть только –help и –version.

Nohup через соединение SSH

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

Одна из распространенных проблем заключается в том, что иногда SSH «зависает» при выходе из системы. Это связано с тем, что SSH часто отказывается терять любой поток данных в фоновые процессы и из них. Затем он будет «зависать», пока процесс не будет завершен.

Эту проблему часто можно решить, перенаправив все 3 потока данных.

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

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: