Как остановить выполнение команды в linux

от admin

Как убить процесс Linux

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

В этой статье мы рассмотрим несколько самых распространенных способов завершить процесс Linux. Опишем подробно как происходит остановка процесса и как все сделать правильно.

Как происходит завершение процесса?

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

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

  • SIGINT — самый безобидный сигнал завершения, означает Interrupt. Он отправляется процессу, запущенному из терминала с помощью сочетания клавиш Ctrl+C. Процесс правильно завершает все свои действия и возвращает управление;
  • SIGQUIT — это еще один сигнал, который отправляется с помощью сочетания клавиш, программе, запущенной в терминале. Он сообщает ей что нужно завершиться и программа может выполнить корректное завершение или проигнорировать сигнал. В отличие от предыдущего, она генерирует дамп памяти. Сочетание клавиш Ctrl+/;
  • SIGHUP — сообщает процессу, что соединение с управляющим терминалом разорвано, отправляется, в основном, системой при разрыве соединения с интернетом;
  • SIGTERM — немедленно завершает процесс, но обрабатывается программой, поэтому позволяет ей завершить дочерние процессы и освободить все ресурсы;
  • SIGKILL — тоже немедленно завершает процесс, но, в отличие от предыдущего варианта, он не передается самому процессу, а обрабатывается ядром. Поэтому ресурсы и дочерние процессы остаются запущенными.

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

Сначала Ctrl+C, если это возможно, затем SIGTERM — он хоть и завершает процесс, но делает эту культурно, и только в крайнем случае SIGKILL. А теперь рассмотрим как убить процесс по pid Linux на практике. Если вы всегда используете SIGKILL, тогда на ум приходит такая картинка:

Как убить процесс Linux?

Для передачи сигналов процессам в Linux используется утилита kill. Ее синтаксис очень прост:

$ kill -сигнал pid_процесса

Сигнал представляет собой один из выше перечисленных сигналов для завершения процесса. По умолчанию, если этот параметр не указан, используется сигнал SIGTERM, что является очень правильно. Также нам нужно указать какой процесс нужно завершить. Для этого используется уникальный идентификатор процесса — PID.

Допустим, у нас выполняется утилита ping. Мы хотим ее завершить с помощью kill. Тогда, сначала мы узнаем ее идентификатор с помощью команды ps:

ps aux | grep ping

В первой строчке отобразится сама утилита ping, а во второй сама программа ps. Берем нужный PID и завершаем процесс с помощью SIGTERM:

kill -TERM 20446

И только если после этой команды процесс продолжил висеть, а это вы можете проверить, выполнив ps. Только теперь можно выполнить SIGKILL:

kill -KILL 20446

Теперь снова проверяем:

Если процесс запущен от суперпользователя, то, естественно, вам нужно использовать sudo. Не всегда удобно уничтожать процесс по его PID, как минимум, потому, что вам этот PID нужно еще узнать. Мы могли бы нагородить сложных конструкций с использованием xargs, чтобы вычислять автоматически pid по имени процесса и сразу же его завершать, но в этом нет необходимости. Уже существуют специальные утилиты.

Как завершить процесс с помощью pkill

Утилита pkill — это оболочка для kill, она ведет себя точно так же, и имеет тот же синтаксис, только в качестве идентификатора процесса ей нужно передать его имя. Утилита сканирует директорию proc и находит PID первого процесса с таким именем, затем отправляет ему SIGTERM. Таким образом, вы можете убить процесс по имени Linux. Например, если мы хотим завершить тот же ping:

Также можно вручную задать тип сигнала:

pkill -TERM ping

Вместо ps, вы можете использовать утилиту pgrep для поиска pid процесса, убедимся что наша программа завершена:

Но если вам программа создала несколько процессов, например, браузер chromium или firefox создают отдельный процесс для каждой из вкладок, то эта утилита мало чем поможет. Тут нужен следующий вариант.

Как остановить процесс с помощью killall

killall работает аналогично двум предыдущим утилитам. Она тоже приминает имя процесса в качестве параметра и ищет его PID в директории /proc. Но эта утилита обнаружит все процессы, с таким именем и завершит их. Например:

Как видите, запущено несколько процессов, осталось остановить процесс Linux с помощью killall:

Команда завершит все запущенные утилиты ping, вы можете убедиться в этом еще раз выполнив pgrep:

Выводы

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

Горячие клавиши в терминале Linux

Давным-давно, такие слова как «hot keys» и «keyboard shortcuts» мне не всегда удавалось перевести на русский без потери лица. Как-то раз, я написал «клавиатурные сокращения», чем сразу же привлёк косые взгляды и вызвал смелые медицинские фантазии. Но вроде бы сейчас принято везде говорить и писать «горячие клавиши». О них и поговорим.

Данная заметка — шпаргалка по линуксовой оболочке Bash и смежным компонентам. Часть приводимых ниже команд относится к библиотеке Readline, часть — к сигналам Linux, однако такие подробности нам здесь не важны. Если вам приходится часто иметь дело с терминалом в Linux (и вы не меняли Bash на другой шелл), то будет очень полезно использовать эти самые «сокращения» на благо себе и в мирных целях. Текст написан для начинающих пользователей, но кто знает — может быть и вы найдёте в нём что-то новое и полезное для себя.

Для удобства будем считать, что по умолчанию под терминалом мы понимаем стандартную в настольной редакции Ubuntu программу «Терминал Gnome».

Вкладки

В программе “Терминал Gnome” предусмотрены вкладки, и работают они аналогично вкладкам в веб-браузере или файловом менеджере. Иными словами, если вам нужно несколько терминалов, вовсе не обязательно открывать несколько окон. Достаточно одного окна с несколькими вкладками. Ниже приведены горячие клавиши, относящиеся ко вкладкам:

Ctrl+Shift+T — открыть новую вкладку;

Ctrl+Shift+W или Ctrl+D — закрыть текущую вкладку (или весь терминал, если вкладка одна);

Ctrl+Shift+N — открыть новое окно терминала из текущего.

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

Ctrl+PgDn — перейти на следующую (справа) вкладку;

Ctrl+PgDn — перейти на предыдущую (слева) вкладку;

Ctrl+Shift+PgDn — сдвинуть вкладку вправо;

Ctrl+Shift+PgUp — сдвинуть вкладку влево.

Alt+1 — перейти на первую по счёту вкладку. Подставьте другую цифру для нужной вам вкладки. Данный способ позволяет «дотянуться» максимум до десятой по счёту вкладки.

Навигация

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

Ctrl+Shift+С — копирование в буфер обмена;

Ctrl+Shift+V — вставка из буфера обмена;

Ctrl+C — прерывание выполняющейся команды или очистка текущей строки.

Для того чтобы выделить нужный текст в терминале, вам потребуется воспользоваться мышью. Тем не менее, в программе “Терминал Gnome” имеется встроенное средство поиска текста, которое позволяет искать как по обычному фрагменту, так и по регулярному выражению:

Ctrl+Shift+F — вызов встроенного поиска по любому тексту в терминале.

Если команда в терминале слишком длинная, или вы сделали опечатку в начале и не сразу это заметили, вы можете вернуться в начало строки. А затем — снова в конец. Вот как это сделать:

Ctrl+A — переместиться в начало строки;

Ctrl+E — переместиться в конец строки.

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

Ctrl+F — переместиться на 1 символ вперед;

Ctrl+B — переместиться на 1 символ назад;

Alt+F — переместиться к следующему слову;

Alt+B — переместиться в начало предыдущего слова.

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

Предыдущие команды касались навигации по терминалу и строке ввода команды. Далее стоит рассмотреть управляющие команды Bash, с помощью которых можно запускать, останавливать, ставить на паузу и возобновлять команды и процессы. Вы уже знаете, что запущенный в терминале процесс можно прервать по Ctrl+C, но полезно также знать и некоторые нюансы.

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

Ctrl+Z — приостановка процесса;

команда bg — возобновление процесса с возвратом командной строки (процесс продолжает выполнение в фоне);

команда fg — возобновление процесса, при котором он удерживает командную строку за собой (процесс выполняется на «переднем плане»).

Процессы также можно приостанавливать и возобновлять. Запустите какую-либо команду, например htop , и нажмите Ctrl+Z. Сначала будет казаться, будто команда завершилась, но она будет числиться в списке запущенных процессов ( ps -a ) и появится вновь после ввода команды fg.

Читать:
Скрипт который двигает мышкой

Если повторить эксперимент с графическим приложением, например, введя команду firefox , то можно будет использовать для его «оживления» как fg , так и bg . При любом варианте приложение останется «закреплённым» за текущим терминалом: если вы закроете его, то оно тоже завершится.

После приостановки процесса firefox в терминале рабочая среда Gnome будет считать, что приложение «не отвечает».

После приостановки процесса firefox в терминале рабочая среда Gnome будет считать, что приложение «не отвечает».

Существует и другой тип «приостановки»: временное прекращение вывода выполняющейся команды. Как консольное, так и графическое приложение может быть запущено в терминале, в который будет выводиться текущая диагностическая информация. Иногда бывает очень удобно временно прекратить постоянный вывод сообщений без завершения самого приложения. Для этого пригодятся следующие сочетания клавиш:

Ctrl+S — прекратить обновление вывода команды;

Ctrl+Q — возобновить вывод команды.

История команд

Bash умеет запоминать все введённые вами команды. Пока терминал запущен, они хранятся в оперативной памяти компьютера, а при выходе из терминала записываются в долговременное хранилище в файле

Если вы точно знаете, что вводили нужную вам команду раньше, поищите её в истории:

history — вывод истории команд;

Если вы помните хотя бы часть команды, поиск можно уточнить:

history | grep <часть команды> — пример уточняющего поиска по истории командам.

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

!151 — выполнить команду под номером 151 из истории;

!151: — показать команду номер 151, но не выполнять её;

!! — повторно выполнить последнюю введенную команду.

В Bash имеется интерактивный режим поиска по истории команд. Нажмите Ctrl+R и начните набирать часть команды. Bash сам предложит вам первый совпадающий вариант. Если он не подходит, нажимайте Ctrl+R дальше для перебора вариантов. Когда нужный вариант будет найден, нажмите Enter.

Интересно, что у этой клавиши ввода есть два аналога — вместо Enter можно нажать Ctrl+M или Ctrl+J.

Самый простой способ перемещаться по истории команд — стрелки «вверх» и «вниз» на клавиатуре. Они тоже имеют дубликаты:

Ctrl+P — вывести предыдущую команду;

Ctrl+N — вывести следующую команду.

Редактирование команд

Самое время рассмотреть средства редактирования команд — они в Bash весьма продвинутые. Удобное перемещение в начало и конец строки, выборочное удаление символов и слов — это лишь часть возможностей, которые могут пригодиться пользователю. За редактирование команд отвечают следующие сочетания клавиш:

Ctrl+U — удалить весь текст слева от курсора;

Ctrl+K — удалить весь текст справа от курсора;

Ctrl+W — удалить 1 слово или параметр слева от курсора;

Ctrl+D — удаление текущего символа (аналогично Del);

Ctrl+H — удаление предыдущего символа (аналогично Backspace);

Alt+D — удалить всё справа от курсора до ближайшего пробела;

Alt+Backspace — удалить всё слева от курсора до ближайшего пробела;

Alt+T — поменять местами текущее слово с предыдущем;

Esc+T — поменять местами два предыдущих слова;

Tab — автодополнение команды после ввода её первых символов.

Ещё одна любопытная деталь: у Bash имеется собственный буфер обмена, который работает независимо от стандартного буфера (как мы помним, копирование по Ctrl+Shift+C, вставка по Ctrl+Shift+V). Это важно, поскольку у первых трёх команд из предыдущего списка есть дополнительные функции: они не просто удаляют часть текста, но и копируют его в тот самый отдельный буфер обмена Bash. Поэтому, будет справедливо уточнить:

Ctrl+U — вырезать и поместить в буфер обмена весь текст слева от курсора;

Ctrl+K — вырезать и поместить в буфер обмена весь текст справа от курсора;

Ctrl+W — вырезать и поместить в буфер обмена 1 слово или параметр слева от курсора;

Кстати, для вставки скопированного текста обратно сработает комбинация Ctrl+Y.

Напоследок

Конечно, выше я описал не все горячие клавиши: их гораздо больше, и полное описание содержало бы в себе кучу бородатой экзотики, унаследованной из древних университетских времён UNIX. В любом случае, не забывайте про man bash (например, там есть замечательный раздел Commands for Moving) и про bind -P .

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

А, вон он о чем. Мастерски вопросы люди задают, я шизею просто.

Готовься кивопросам «че это», «а как» и «напишите мне на языке программирования выход из программы».

покажите как пожалуйста? программа закрывается с помощью ctrl+z

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

закрывается с помощью ctrl+z она

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

Как из другой программы закрыть эту программу?
Как свою программу сделать закрывающейся по Q?
Сформулируй, что тебе вообще нужно-то, а то вон телепаты мимо бьют.

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

Какой информативный ответ. Так и быть, давайте еще раз попробуем:

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

Как выйти из скрипта Bash

Если вы пишете Баш-скрипт или даже просто выполняя одну из них, важно знать, как выйти из Баш-скрипт .

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

В этом руководстве вы узнаете, как выйти из скрипта Bash либо из скрипта, либо из командная строка пока скрипт выполняется на Linux-система .

В этом уроке вы узнаете:

  • Как выйти из скрипта Bash в терминале
  • Как выйти из скрипта Bash внутри скрипта
  • Как использовать разные коды выхода в скрипте Bash

Как выйти из скрипта Bash в терминале

Это посылает ПОДПИСЬ сигнал прерывания для сценария, и в 99% случаев это должно немедленно завершить работу сценария, который вы выполняете.

Единственное исключение, если ловушка был настроен, чтобы поймать ПОДПИСЬ сигнал. Это имеет место в сценариях, которым необходимо завершить определенную задачу, даже если пользователю срочно нужно остановить сценарий досрочно. В этом случае вам, вероятно, следует просто дождаться завершения скрипта.

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

Как выйти из скрипта Bash внутри скрипта

Естественно, сценарий Bash завершается всякий раз, когда он достигает конца сценария. Но иногда сценарий не предназначен для выполнения до конца, например, в случае с условным оператором.

То выход Команда может быть записана в сценарий Bash, чтобы вручную завершить ее в определенный момент. Код выхода из 0 обычно указывает на то, что скрипт завершил работу без каких-либо ошибок. Код выхода из 1 или выше обычно указывает на то, что при выходе произошла ошибка. Однако разработчик должен решить, что он хочет, чтобы эти коды означали в его скрипте.

Давайте посмотрим на некоторые примеры.

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

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

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

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

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

Заключительные мысли

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

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

LinuxConfig ищет технического писателя (писателей), ориентированного на технологии GNU/Linux и FLOSS. В ваших статьях будут представлены различные руководства по настройке GNU/Linux и технологии FLOSS, используемые в сочетании с операционной системой GNU/Linux.

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

  • 04/03/2022
  • 0
  • БашПрограммированиеСценарииРазработка

Bash Loops с примерами

  • 09/08/2021
  • 0
  • БашПрограммированиеСценарииРазработка

Готовы погрузиться в цикл Bash? Благодаря популярности Linux как бесплатной операционной системы и мощи команды Bash строчный интерфейс, можно пойти еще дальше, кодируя расширенные циклы прямо из командной строки или внутри Bash скрипты.Используя .

Создание самозаверяющего SSL-сертификата

  • 08/08/2021
  • 0
  • БашБезопасностьТерминал

В этой статье объясняется, как создать самоподписанный сертификат SSL с помощью openssl орудие труда.Что такое самоподписанный сертификат SSL? #Самозаверяющий сертификат SSL — это сертификат, подписанный лицом, создавшим его, а не доверенным центр.

Подоболочки Linux для начинающих с примерами

Подоболочки Linux для начинающих с примерами

  • 09/08/2021
  • 0
  • БашАдминистрацияКомандыРазработка

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

Похожие статьи