Программы — это наборы инструкций, которые выполняет компьютер. Когда мы запускаем программу, инструкции копируются в память компьютера.
После этого в памяти выделяется пространство под хранение переменных и других вещей, необходимых для запуска программы.
Запущенный экземпляр программы называется процессом. Процессами можно управлять.
Как узнать, какие процессы запущены сейчас
Linux, как и большинство современных ОС, — мультизадачен. Это значит, что в Linux одновременно может работать множество процессов.
Процессы запускать можем не только мы, но и другие пользователи, и сама операционная система. Чтобы увидеть список запущенных в системе процессов нужно воспользоваться командой top .
Вот упрощенная версия того, что вы должны увидеть при запуске этой программы.
1. [email protected]: top
2. Tasks: 174 total, 3 running, 171 sleeping, 0 stopped
3. KiB Mem: 4050604 total, 3114428 used, 936176 free
4. Kib Swap: 2104476 total, 18132 used, 2086344 free
МЕНЮ НЕДАВНИХ ПРИЛОЖЕНИЙ НА ЛЮБОМ ANDROID TV БОКСЕ!
5.
6. PID USER %CPU %MEM COMMAND
7. 6978 karpaff 3.0 21.2 firefox
8. 11 root 0.3 0.0 rcu_preempt
9. 6601 karpaff 2.0 2.4 kwin
10. .
Давайте подробнее разберемся, что здесь происходит:
- Строка 2. Задачи (tasks) — это второе название процессов. В любой момент времени в вашей системе выполняется сразу несколько процессов. Большая часть из них системные. Многие — спят, и это нормально. «Спящие» процессы ожидают какого-то события, чтобы перейти в активное состояние.
- Строка 3. Это анализ оперативной памяти. Не переживайте, если используется огромное количество памяти: Linux сохраняет недавно открытые программы для повышения быстродействия. Если какому-то процессу понадобится эта память — она очистится.
- Строка 4. Это анализ виртуальной памяти системы. Если используется большое количество памяти — пора задуматься о ее увеличении. При наличии современного компьютера с достаточным количеством памяти такой проблемы у вас не возникнет.
- Строки 6-10. Список наиболее ресурсоемких процессов системы в порядке убывания. Он обновляется в реальном времени — наблюдать за этим одно удовольствие. У вас перед глазами все, что происходит в вашей системе. Два важных столбца — используемая память и процент использования ЦП. Если какой-то из них находится на высоком уровне продолжительное время, стоит узнать, почему так. В столбце USER указывается пользователь, который запустил данный процесс, а PID это столбец, в котором указаны ID процессов — их уникальные идентификаторы.
Команда top предоставляет информацию о системе в реальном времени и показывает лишь то число процессов, которые умещаются на экране.
Есть другая команда — ps (processes, процессы). Обычно ее используют для того, чтобы увидеть список процессов в текущем терминале. Но если добавить аргумент aux , выведется полный список процессов, что гораздо полезнее.
Вывод порой слишком громоздкий, поэтому обычно для фильтрации данных применяется контейнеризация вывода в grep . В примерах ниже мы увидим, как это работает.
Основы Linux. Управление процессами. Часть 1
Как удалить из памяти процессы, потерпевшие сбой
Происходит это не так часто, но любые сбои раздражают. Допустим, у нас запущен браузер и в какой-то момент времени он зависает. Вы пытаетесь его закрыть, но он не отвечает.
Это не страшно: процесс условного Firefox можно завершить и запустить браузер снова. Но сначала нам нужно узнать ID процесса браузера — PID (proccess ID, идентификатор процесса). Вот, как это будет выглядеть:
1. [email protected]: ps aux | grep ‘firefox’
2. karpaff 6978 8.8 23.5 2344096 945452 ? Sl 08:03 49:53 /usr/lib64/firefox/firefox
3. [email protected]:
Рядом с пользователем karpaff находится число — это и есть PID. Его мы будем использовать для обозначения процесса, который мы хотим закрыть. Для завершения процесса существует специальная команда — kill .
1. [email protected]: kill 6978
2. [email protected]: ps aux | grep ‘firefox’
3. karpaff 6978 8.8 23.5 2344096 945452 ? Sl 08:03 49:53 /usr/lib64/firefox/firefox
4. [email protected]:
Обычно простой запуск kill завершает зависший процесс. В этом случае команда отправляет параметр по умолчанию — -1 . Этот сигнал указывает процессу, ему надо закрыться. Сначала всегда нужно попытаться воспользоваться этим вариантом: он короче.
Однако это не всегда работает. В примере выше мы запускали ps, но процесс все еще работал. Ничего страшного, значит, мы просто подадим параметр -9 — это сигнал для принудительного завершения процесса.
1. [email protected]: kill -9 6978
2. [email protected]: ps aux | grep ‘firefox’
3. [email protected]:
Примечание. Пользователь без root-прав может завершать лишь те процессы, которые он запустил. Root-пользователь может завершить любой.
Что делать, если завис рабочий стол
Иногда зависший процесс тянет за собой и рабочий стол. Давайте разберемся, что делать в ситуации, когда рабочий стол тоже завис.
В Linux работает сразу несколько виртуальных консолей. Большую часть времени мы видим консоль номер 7 — с GUI. Но мы можем легко обратиться к другим.
Если GUI завис, можно закрыть проблемные процессы с другой консоли. Для переключения между консолями используйте последовательность Ctrl + Alt + F . Например, после нажатия Ctrl + Alt + F2 вы подключитесь к консоли, с помощью которой сможете получить id приведших к сбою процессов и отключить их. А Ctrl + Alt + F7 вернет вас в GUI, чтобы проверить, все ли в порядке.
Общая тактика такая: отключать процессы до тех пор, пока рабочий стол не «отвиснет».
Совет. Ищите процессы, которые потребляют много памяти и активно используют ЦП: обычно дело именно в них. Если это не помогает, проще перезагрузить компьютер.
Фоновые процессы и процессы переднего плана
Возможно, этим вы будете пользоваться этим не часто, но знать об этом довольно полезно: в редких случаях пригодится.
Программы, которые мы обычно запускаем, находятся на переднем плане. Большая часть их них выполняется за долю секунды. Возможно, мы захотим запустить процесс, который займет чуть больше времени и выполнится без нашего вмешательства: например, компиляция программы или обработка большого текстового файла. В этом случае нам нужно запустить программу на фоне и просто продолжать работать.
В качестве примера приведем команду sleep . Эта команда ждет, когда пройдет заданное количество времени и завершает свою работу.
Для отображения работающих в фоне процессов можно использовать команду jobs .
1. [email protected]: sleep 5
2. [email protected]:
Если вы запустите эту программу, то заметите, что терминал ждет 5 секунд и только потом предлагает ввод снова. Но если мы сделаем то же самое, но добавим в конец
2. [1] 21634
3. [email protected]:
4. [email protected]:
5. [1]+ Done sleep 5
В этот раз процессу присваивается номер (и он, конечно же, выводится), и приглашение к вводу появляется сразу. Мы можем продолжать работать, пока выполняется фоновый процесс. Если по прошествии 5 секунд вы нажмете Enter, вы увидите сообщение, в котором говорится о том, что задание завершено.
HackWare.ru
Этичный хакинг и тестирование на проникновение, информационная безопасность
Азы работы в командной строке Linux (часть 7)
- Азы работы в командной строке Linux (часть 1)
- Азы работы в командной строке Linux (часть 2)
- Азы работы в командной строке Linux (часть 3)
- Азы работы в командной строке Linux (часть 4)
- Азы работы в командной строке Linux (часть 5)
- Азы работы в командной строке Linux (часть 6)
В этой части мы научимся наблюдать за процессами в Linux, это может быть полезным для решения проблем с производительностью. Например, система медленно работает из-за того, что какая-то программа полностью использует центральный процессор или заняла всю оперативную память. Мы научимся находить и останавливать процессы, которые потребляют больше всего ресурсов, просматривать все запущенные процессы, менять их приоритет и выполнять другие действия с ними.
top для показа процессов в реальном времени
У программы top есть опции, но большую часть настройки можно сделать интерактивными командами в запущенной программе. Для запуска выполните:
В самом верху информация об использовании ресурсов центрального процессора и оперативной памяти. Если ваша система «тормозит», работает медленно, то посмотрите, что именно происходит: полностью загружен процессор или закончилась память.
На моём скриншоте проблем с производительностью нет, но давайте представим, что полностью загружен центральный процессор. Процессы отсортированы по уровню потребления времени ЦПУ — от самого прожорливого (то есть в порядке убывания). Чтобы убедиться в этом нажмите кнопку x — будет подсвечен столбец по которому выполняется сортировка.
Если закончилась оперативная память, то нужно сделать сортировку процессов по потреблению памяти. Для переключения столбца нажимайте клавиши и >. Это не символы курсорных клавишей. Это символы на английской раскладке, которые на русской раскладке находятся на буквах «б» и «ю». Чтобы отправить этот символ, нужно нажать Shift+, (запятая) и Shift+.
(точка).
Теперь процессы отфильтрованы по столбцу %MEM (память):
Как можно увидеть, на моей системе больше всего памяти потребляет процесс libreoffice (офисные приложения) и chromium (веб-браузер).
Для включения/отключения цвета: z
Для включения/отключения полужирных шрифтов: b
Для показов команды запуска: c
Для включения и отключения древовидного вывода процессов: V (то есть Shift+v)
Можно выводить до четырёх отдельных вкладок (окон) программы top в одном окне — в каждой из них можно сделать разные настройки вывода. Подробности смотрите в статье «Как пользоваться командой top для наблюдения за процессами в Linux».
htop — простая альтернатива top
В программе top можно искать (фильтровать) процессы, останавливать их, менять порядок и тип выводимых столбцов. Но каждое это действие выполняется командой, которую нужно помнить — это неудобно. В программе htop самые востребованные функции по управлению процессами назначены на функциональные клавиши F1-F12 и информация о них всегда присутствует на экране. То есть программа htop похожа на top, но проще в использовании:
Программа htop по умолчанию раскрашена цветами, выводит команды процессов и подсвечивает колонку, по которой выполняется сортировка.
systemctl для просмотра состояния служб
Если вам интересует, что происходит с определённой службой — запущена ли она, возникла ли ошибка при запуске или с ней всё в порядке, то вместо поиска службы для интерактивного показа процессов или снимка процессов, удобнее использовать команду systemctl.
Службы (демоны) работают в фоне, примеры популярных служб: sshd, apache2 (веб-сервер в Debian и производных), httpd (веб-сервер в Arch Linux и производных), iptables (файервол).
К примеру, меня интересует, запущена ли служба SSH сервера на компьютере, на котором я в данный момент работаю, тогда мне нужно выполнить следующую команду:
systemctl status sshd
Служба SSH сервера не запущена.
Просмотр статуса веб-сервера:
systemctl status httpd
ps для получения снимка процессов
Программы top и htop выводят на экран постоянно обновляемую информацию о процессах, а программа ps выводит информацию один раз на момент выполнения программы.
Программу ps удобно использовать, если нужно просто проверить, запущен ли определённый процесс, либо узнать идентификатор процесса, либо для работы с процессами в скриптах. Кстати, программа top тоже умеет выводить снимок процессов — в инструкции, на которую выше дана ссылка, написано как это сделать.
Чтобы вывести список всех активных процессов:
ps -e
В таком списке удобно искать с помощью grep:
ps -e | grep firefox
Следующая команда выведет все процессы (-e), для процессов будут показаны поля Идентификатор процесса, Идентификатор родительского процесса, потребление времени ЦПУ, потребление памяти, команда и аргументы, которой был запущен процесс (-o pid,ppid,pcpu,pmem,args), будет показано дерево процессов (—forest) и процессы будут отсортированы по использованию процессора в порядке убывания (—sort -pcpu):
ps -e -o pid,ppid,pcpu,pmem,args —forest —sort -pcpu
Интересный пример комбинирования команд ps с watch и head — будет выведен список топ-10 процессов, потребляющих оперативную память, этот список будет обновляться каждую секунду:
watch -n 1 ‘ps -eo pid,ppid,cmd,%mem,%cpu —sort=-%mem | head’
Как и предыдущая команда, но для потребителей ЦПУ:
watch -n 1 ‘ps -eo pid,ppid,cmd,%mem,%cpu —sort=-%cpu | head’
lsof для показа открытых файлов
Файлы открываются процессами. Иногда нужно знать, какие файлы открыл процесс или каким процессом открыт файл. Это может понадобиться для мониторинга активности процессов, либо для решения проблем, когда невозможно выполнить действие из-за того, что какой-то процесс использует файл.
Чтобы увидеть, какой процесс открыл файл, нужно указать путь до этого файла:
lsof ‘Documents/Linux.odt’
В качестве файла могут быть устройства, например, жёсткий диск:
lsof /dev/sda
Чтобы увидеть все файлы, которые открыты в определённом каталоге, используйте опцию +D и укажите путь до каталога, например, для просмотра всех открытых файлов в директории /var/log/ и открывших их процессов:
sudo lsof +D /var/log/
В столбце COMMAND показано имя процесса, открывшего файл, а в столбце PID показан идентификатор процесса.
Чтобы увидеть все файлы, которые были открыты из каталога /home:
sudo lsof +D /home
Чтобы показать все открытые на дисках файлы:
sudo lsof /
Чтобы увидеть файлы, которые были открыты определенным процессом, используйте параметр -c КОМАНДА:
sudo lsof -c ssh
pstree для вывода дерева процессов
Программа pstree показывает дерево процессов, то есть связи между родительскими и дочерними процессами:
pstree -l
pgrep для поиска процесса
Вместо запуска ps и последующей фильтрации с помощью grep можно использовать одну команду pgrep, которая запускается так:
pgrep ИМЯ_ПРОЦЕССА
Например, для поиска процесса firefox:
pgrep firefox
Если процесс найден, то будет выведен его идентификатор (PID), а если процесс не найден, то ничего не будет выведено.
Если указать опцию -a, то заодно будет выведен и полный путь до исполнимого файла:
pgrep -a firefox 24664 /usr/lib/firefox/firefox
kill, pkill и killall для остановки процесса
Чтобы закрыть, выключить процессы используются команды:
kill ИДЕНТИФИКАТОР_ПРОЦЕССА pkill ИМЯ_ПРОЦЕССА killall ИМЯ_ПРОЦЕССА
Разница между командами pkill и killall в том, что pkill принимаемое ИМЯ_ПРОЦЕССА использует для поиска как по всему имени, так и по части имени. А killall по умолчанию ищет точное совпадение имени процесса. То есть если вместо «firefox» указать «firef», то pkill закроет все процессы firefox, а killall не закроет ни одного процесса.
kill 24664 pkill firefox killall firefox
Как увидеть сообщения, которые выводят процессы
Если при запуске утилиты в командной строке что-то не в порядке (например, отсутствует необходимая зависимость), то программа перед завершением работы выводит сообщение об ошибке. На самом деле, в консоль могут выводиться не только ошибки, но и обычные сообщения о работе программы. К тому же, не только программы с интерфейсом командной строки выводят сообщения, но и программы с графическим интерфейсом, а также демоны (процессы, отсоединённые от терминала), также выводят сообщения, которые хранятся в системных журналах.
Чтобы увидеть ошибки и сообщения, которые выводят процессы запустите команду вида:
sudo journalctl _COMM=ПРОГРАММА
Например, чтобы увидеть сообщения от процесса sshd:
sudo journalctl _COMM=sshd
Если добавить опцию -f, то новые сообщения будут выводиться по мере их появления:
sudo journalctl -f _COMM=NetworkManager
Это работает и для приложений с графическим интерфейсом:
sudo journalctl -f _COMM=chromium
Чтобы увидеть все сообщения от любых служб, выполните такую команду (может пригодиться при выяснении причин, почему не работает веб-сервер, MySQL или SSH сервер или почему не запускается OpenVPN и т.д.):
sudo journalctl -xe
Чтобы показать записи в системном журнале одного процесса с указанным PID:
sudo journalctl _PID=409200
Программы для работы с процессами в Linux
Подробные статьи по каждой из рассмотренных программ:
- Как пользоваться командой top для наблюдения за процессами в Linux
- Инструкция по использованию команды htop для интерактивного просмотра процессов в Linux
- Как использовать команду ps для мониторинга процессов Linux
- Как пользоваться lsof для просмотра открытых файлов (в Linux всё является файлами)
- Как использовать Systemctl для управления службами Systemd и юнитами
- Как использовать journalctl для просмотра системных логов Linux
Связанные статьи:
- Как использовать Systemctl для управления службами Systemd и юнитами (66%)
- Решение проблемы в Kali Linux «W: Произошла ошибка при проверке подписи. Репозиторий не обновлён и будут использованы предыдущие индексные файлы. Ошибка GPG» (56.5%)
- Решение проблемы «E: Не удалось получить доступ к файлу блокировки /var/lib/dpkg/lock» в Kali Linux (56.5%)
- Как на Linux Mint или Ubuntu установить BeEF. Решение проблемы ERROR: invalid username or password (53.6%)
- Как установить Bettercap в Linux Mint или Ubuntu (53.6%)
- Как запустить пользовательский дистрибутив на DigitalOcean. Как установить Kali Linux на DigitalOcean (RANDOM — 50%)
Источник: hackware.ru
Основы Linux от основателя Gentoo. Часть 2 (3/5): Управление процессами
В этом отрывке рассмотрены команды управления процессами. Вы научитесь замораживать процессы, размораживать, отправлять в фоновый режим, изменять приоритет, просматривать запущенные процессы и жестоко их убивать. Введено понятие сигналов. Рассмотрены такие команды, как bg, fg, jobs, kill, nohup, nice, renice, ps и top.
Навигация по основам Linux от основателя Gentoo:
Часть I
- BASH: основы навигации (вступление)
- Управление файлами и директориями
- Ссылки, а также удаление файлов и директорий
- Glob-подстановки (итоги и ссылки)
Часть II
- Регулярные выражения (вступление)
- Назначения папок, поиск файлов
- Управление процессами
- Обработка текста и перенаправления
- Модули ядра (итоги и ссылки)
Управление процессами
Запуск xeyes
Для изучения управления процессами, какой-нибудь процесс необходимо сначала запустить. Убедитесь, что у вас запущен X (графический сервер — прим. пер.) и выполните следующую команду:
$ xeyes -center red
Вы увидите всплывающее окошко xeyes и красные глаза, следящие за курсором мыши. Также, обратите внимание, что у вас не появилось приглашения для ввода команд в терминале.
Остановка процесса
Чтобы вернуть приглашение, вы должны нажать Control-C (часто пишется как Ctrl-C или ^C):
Вы получили назад свое приглашение, но и окно xeyes исчезло. Фактически, процесс был «убит». Вместо завершения по Control-C, мы можем просто остановить процесс с помощью Control-Z:
$ xeyes -center red
Control-Z
[1]+ Stopped xeyes -center red
На этот раз вы получите приглашение bash’a, а окно xeyes останется сверху. Если вы с ним немного поиграете, возможно заметите, что глаза заморожены на одном месте. Если окно xeyes будет перекрыто другим окном и затем снова открыто, вы увидите, что оно даже не перерисовалось. Процесс не делает ничего.
Он на самом деле остановлен.
fg и bg
Чтобы процесс «растормошить» и запустить обратно, мы можем вывести его на передний план используя команду fg (от англ. foreground — прим. пер.):
$ fg
(test it out, then stop the process again)
Control-Z
[1]+ Stopped xeyes -center red
А теперь продолжим его в фоне с помощью команды bg (от англ. backgroud — прим. пер.):
$ bg
[1]+ xeyes -center red
Если нам нужно сразу запустить xeyes в фоновом режиме (вместо использования Control-Z и bg), мы можем просто добавить » (амперсанд) в конец команды xeyes:
$ xeyes -center blue amp [2]+ 16224 Running xeyes -center blue например, fg 1 сделает таковым красный xeyes. Следующая колонка это идентификатор процесса или сокращенно pid, любезно добавленный в вывод благодаря опции -l. Наконец, состояние обоих процессов «Running» (выполняется) и их командная строка справа.
Введение в сигналы
Чтобы убить, остановить, или продолжить процесс, Linux использует специальную форму взаимодействия, называемую сигналы. Отправляя сигнал некоторому процессу, вы можете его завершить, остановить, или сделать что-нибудь еще. Это то, что происходит на самом деле, когда вы нажимаете Control-C, Control-Z, или используете bg и fg — вы указываете bash отправить процессу определенный сигнал. Сигналы также можно отправить с помощью команды kill указав ей как параметр id процесса (pid):
$ kill -s SIGSTOP 16224
$ jobs -l
[1]- 16217 Running xeyes -center red некоторые сигналы могут обрабатываться внутри самих программ. Вы можете узнать о сигналах которые обрабатывает конкретная программа поискав в ее man’е секцию SIGNALS.
SIGTERM и SIGINT
Если вы хотите убить процесс, есть несколько вариантов. По-умолчанию, kill отправляет SIGTERM, который отличается от SIGINT отправляемого по Control-C, но обычно имеет тот же эффект:
$ kill 16217
$ jobs -l
[1]- 16217 Terminated xeyes -center red [2]+ 16224 Stopped (signal) xeyes -center blue
Полное убийство
Процесс может игнорировать оба сигнала, SIGTERM и SIGINT, либо по своему усмотрению, либо потому, что он остановлен, либо еще как-то «застрял». В этом случае, может быть необходимо использование большого молотка — сигнала SIGKILL. Процесс не может игнорировать SIGKILL:
$ kill 16224
$ jobs -l
[2]+ 16224 Stopped (signal) xeyes -center blue
$ kill -s SIGKILL 16224
$ jobs -l
[2]+ 16224 Interrupt xeyes -center blue
nohup
Терминал в котором вы запускаете задания, называется терминалом управления заданиями. Некоторые шеллы (но не bash по-умолчанию), отправляют сигнал SIGHUP фоновым заданиям когда вы выходите, заставляя их завершаться. Для защиты процессов от такого поведения, используйте nohup когда запускаете процесс:
$ nohup make прим. пер.) другим процессам, позволяя им получить более приоритетный доступ к времени CPU. По-умолчанию, процессы запускаются с приоритетом 0, поэтому установка приоритета в 10 для oggenc значит, что он будет давать больше времени поработать другим процессам. Как правило, это означает, что oggenc даст возможность другим процессам выполняться со своей обычной скоростью, не зависимо от того, сколько времени процессора хочет сам oggenc. Вы могли видеть эти «уровни любезности» в колонке NI у ps и top ранее.
renice
Команда nice может изменять приоритет процессов только во время их запуска. Если вам необходимо изменить приоритет работающего процесса, воспользуйтесь командой renice:
$ ps l 641
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 000 1000 641 1 9 0 5876 2808 do_sel S ? 2:14 sawfish
$ renice 10 641
641: old priority 0, new priority 10
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 000 1000 641 1 9 10 5876 2808 do_sel S ? 2:14 sawfish
Об авторах
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. В свободное от программирования время Эйрон предпочитает размыщлять над проблемами программирования катаясь на своем велосипеде, жонглируя битами, или болея за бостонскую профессиональную бейсбольную команду «Красные Носки».
Источник: habr.com