Временная остановка выполнения процесса. Остановка и возобновление процесса Остановка процесса
Помимо прямого указания выполнять программу в фоновом режиме, существует еще один способ перевести процесс в фоновый режим. Для этого необходимо выполнить следующие действия:
запустить процесс выполняться на переднем плане;
остановить выполнение процесса;
продолжить процесс в фоновом режиме.
Для выполнения программы введем ее имя
в командной строке и запустим на
выполнение. Для остановки выполнения
программы необходимо нажать на клавиатуре
следующую комбинацию клавиш -
/home/student# yes > /dev/null
Stopped yes >/dev/null
Получено приглашение командной строки. Для того чтобы перевести выполнение процесса в фоновый режим, необходимо выполнить следующую команду:
Причем необязательно делать это сразу после остановки процесса, главное правильно указать номер остановленного процесса.
Для того чтобы вернуть процесс из в фонового режима выполнения на передний план, достаточно выполнить следующую команду:
В том случае, если необходимо перевести программу в фоновый или, наоборот, на передний план выполнения сразу после остановки процесса, можно выполнить соответствующую программу без указания номера остановленного процесса.
Существует большая разница между фоновым и остановленным процессом. Остановленный процесс не выполняется и не потребляет ресурсы процесса, однако занимает оперативную память или пространство свопинга. В фоновом же режиме процесс продолжает выполняться.
Для приостановления фонового процесса необходимо переместить процесс на передний план, а затем остановить.
Завершение работы процесса
Существует несколько вариантов завершения работы процесса.
Вариант первый. Если процесс интерактивный, как правило, в документации или прямо на экране написано, как корректно завершить программу.
Вариант второй.
В том случае, если
не указано как можно завершить
текущий
процесс (не фоновый), то можно
воспользоваться клавиатурной
комбинацией
Вариант третий и самый действенный. В том случае, если не удалось прекратить выполнение процесса вышеприведенными способами – например, программа зависла или "слетел" терминал - для завершения процесса можно воспользоваться следующими командами: kill, killall.
Команда kill может получать в качестве аргумента как номер процесса, так и идентификационный номер (PID) процесса. Таким образом, команда:
/home/student# kill 123 эквивалентна команде:
/home/student# kill %1
Можно видеть, что не надо использовать "%", когда вы обращаетесь к работе по идентификационному номеру (PID) процесса.
С помощью команды killall можно прекратить выполнение нескольких процессов сразу, имеющих одно и то же имя. Например, команда killall mc прекратит работу всех программ mc, запущенных от имени данного пользователя.
Для того чтобы завершить работу процесса, пользователю надо быть его владельцем. Пользователь root может завершить работу любого процесса в операционной системе.
Не справляется с этой задачей.
Иногда возникает необходимость вручную завершить процесс, который не отвечает. В большинстве случаев это можно сделать с помощью Диспетчера задач Windows, однако порой ему не удается справиться с вышедшим из под контроля приложением. Мне часто приходилось сталкиваться с этим при попытке завершить процесс Acronis. В такой ситуации я обычно использую более мощный инструмент - команду taskkill.
Чтобы воспользоваться taskkill, нужно открыть окно командной строки. Для этого вызовите окно «Выполнить» (Run) из меню «Пуск» (Start) или воспользуйтесь клавишной комбинацией +[R] и введите «cmd» (без кавычек) в поле «Открыть» (Open, рис. A).
Рисунок A. Откройте окно командной строки.
Использование команды taskkill
Общий синтаксис команды выглядит следующим образом:
Taskkill [ОПЦИИ] [ИДЕНТИФИКАТОР ПРОЦЕССА]
Разумеется, для taskkill доступен широкий выбор опций. Перечислю лишь наиболее полезные из них:
/s КОМПЬЮТЕР, где КОМПЬЮТЕР - это IP или адрес удаленного компьютера. По умолчанию, операция выполняется в локальной системе. Если именно это вас и интересует, данную опцию можно не использовать.
/u ДОМЕН\ПОЛЬЗОВАТЕЛЬ , где ДОМЕН - это имя домена, а ПОЛЬЗОВАТЕЛЬ - имя пользователя, для которого нужно выполнить команду. Данная опция позволяет запускать taskkill с правами определенной учетной записи или домена.
/p - обязательно используется в сочетании с опцией /u для указания пароля к учетной записи пользователя.
/fi - позволяет выполнять команду taskkill с определенными фильтрами.
/f - принудительно завершает выполнение команды.
/IM - позволяет использовать имя приложения вместо идентификатора процесса.
Ну и разумеется, одна из самых полезных опций - переключатель для вызова справки (рис. В):
Taskkill /?
Рисунок B. Вывод справочной информации по команде taskkill при использовании переключателя справки.
Завершение процесса по имени приложения
Проще всего завершить вышедший из-под контроля процесс, воспользовавшись командой taskkill с использованием опции /IM. Выглядеть это будет так:
Taskkill /IM ИМЯ_ПРИЛОЖЕНИЯ
Здесь ИМЯ_ПРИЛОЖЕНИЯ - это имя процесса, который требуется завершить. К примеру, если Outlook не удается закрыть, можно воспользоваться следующей командой:
Taskkill /IM outlook.exe
Завершение процесса по идентификатора
Если вы не знаете имени процесса, но знаете его идентификатор (PID) - например, 572 - можно воспользоваться следующей командой:
Taskkill /PID 572
Завершение всех процессов для определенной учетной записи
Существует также возможность завершить все процессы для определенной учетной записи. Это особенно актуально, если совершенно точно известно, что проблема связана с определенной учетной записью, или если пользователь уже вышел из системы, а запущенные им процессы перестали отвечать. В таком случае можно воспользоваться следующей командой:
Taskkill /F /FI “USERNAME eq имя_пользователя”
Здесь имя_пользователя - это имя учетной записи, под которой запущены нежелательные процессы. Обязательно нужно включить в команду опцию USERNAME, чтобы указать соответствующее имя пользователя.
Завершение процессов на удаленном компьютере
Еще одна удобная возможность - завершение процессов в удаленном режиме. Допустим, вы точно знаете, что система не отвечает из-за определенного процесса (возьмем для примера все тот же Outlook). В таком случае можно воспользоваться другим компьютером и выполнить следующую команду:
Taskkill /s IP-АДРЕС /u ДОМЕН\ПОЛЬЗОВАТЕЛЬ /IM Outlook.exe
Здесь IP-АДРЕС - адрес удаленного компьютера (можно использовать и имя хоста, если компьютеры способны распознавать друг друга таким способом), ДОМЕН - имя домена (если требуется), а ПОЛЬЗОВАТЕЛЬ - имя пользователя, под которым был осуществлен вход на удаленный компьютер.
В заключение
Команда taskkill - весьма мощный и функциональный инструмент, способный избавить от необходимости принудительной перезагрузки компьютера. Умелое использование этой команды в сочетании с Диспетчером задач продлевает время безотказной работы системы и даже позволяет бороться с вирусами, руткитами или троянцами.
Инструкция
Все запущенные процессы делятся на запускаемые автоматически при старте системы и стартующие при нажатии пользователем на ярлык той или иной программы. Первые, в свою очередь, делятся на системные, необходимые для работы ОС, и процессы пользовательских программ, для которых установлена опция автозапуска.
Чтобы остановить процесс, надо знать его имя. Откройте командную строку: «Пуск – Все программы – Стандартные – Командная строка». Введите команду tasklist и нажмите Enter. Вы увидите список запущенных в системе процессов. Если вы не можете по названию процесса определить его принадлежность, воспользуйтесь программой Everest. С ее помощью вы получите всю информацию о вашем компьютере, включая данные о запущенных процессах и пути к исполняемым файлам.
Остановить процесс можно несколькими способами. Самый простой – через "Диспетчер задач" (Ctrl + Alt + Del). Выберите в списке процессов тот, который вы желаете остановить, и кликните его правой кнопкой мышки. В открывшемся контекстном меню выберите «Завершить процесс». Помните о том, что вы не сможете остановить критически важные системные процессы, операционная система вам этого не позволит.
Остановить процесс можно и из командной строки, для этого введите команду taskkill /pid 1234 /f и нажмите Enter. Вместо «1234» введите идентификатор процесса (PID), его посмотрите в последней колонке списка, выводимого командой tasklist. Параметр f в команде определяет принудительное завершение процесса. Для просмотра всех вариантов использования команды taskkill введите в командной строке taskkill /? и нажмите Enter.
Если вы хотите остановить запущенную службу, откройте: «Пуск – Панель управления – Администрирование – Службы». Найдите нужную службу и дважды кликните ее мышкой. В открывшемся окне нажмите кнопку «Стоп», служба будет остановлена. Далее вы можете отключить ее запуск, выбрав в меню «Тип запуска» вариант «Отключить».
После остановки службы вы можете ее перезапустить, нажав кнопку «Старт». Кнопка видна в том случае, если в меню «Тип запуска» выбраны варианты «Авто» или «Вручную». Если выбран вариант «Отключено», кнопка будет неактивна.
Для запуска процесса, не являющегося службой и, соответственно, не отображающегося в списке служб, отыщите и запустите его исполнимый файл. Путь к файлу посмотрите в программе Everest до остановки процесса. Вы можете запустить процесс и из командной строки – например, для запуска Блокнота наберите в командной строке notepad.exe и нажмите Enter. Для запуска установленных вами программ необходимо ввести полный путь к исполнимому файлу.
Несмотря на то что 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 очень опасна, но так делать не стоит. Надеюсь, эта информация была полезна для вас.
В этом отрывке рассмотрены команды управления процессами. Вы научитесь замораживать процессы, размораживать, отправлять в фоновый режим, изменять приоритет, просматривать запущенные процессы и жестоко их убивать. Введено понятие сигналов. Рассмотрены такие команды, как bg, fg, jobs, kill, nohup, nice, renice, ps и top.
Об авторах
Daniel Robbins
Дэниэль Роббинс - основатель сообщества Gentoo и создатель операционной системы Gentoo Linux. Дэниэль проживает в Нью-Мехико со свой женой Мэри и двумя энергичными дочерьми. Он также основатель и глава Funtoo , написал множество технических статей для IBM developerWorks , Intel Developer Services и C/C++ Users Journal.
Chris Houser
Крис Хаусер был сторонником UNIX c 1994 года, когда присоединился к команде администраторов университета Тэйлора (Индиана, США), где получил степень бакалавра в компьютерных науках и математике. После он работал во множестве областей, включая веб-приложения, редактирование видео, драйвера для UNIX и криптографическую защиту. В настоящий момент работает в Sentry Data Systems. Крис также сделал вклад во множество свободных проектов, таких как Gentoo Linux и Clojure, стал соавтором книги The Joy of Clojure .
Aron Griffis
Эйрон Гриффис живет на территории Бостона, где провел последнее десятилетие работая в Hewlett-Packard над такими проектами, как сетевые UNIX-драйвера для Tru64, сертификация безопасности Linux, Xen и KVM виртуализация, и самое последнее - платформа HP ePrint . В свободное от программирования время Эйрон предпочитает размыщлять над проблемами программирования катаясь на своем велосипеде, жонглируя битами, или болея за бостонскую профессиональную бейсбольную команду «Красные Носки».