
- •Практическая работа
- •4. Команда top
- •Сигналы
- •15 Примеров использования в linux команды top
- •2. Уничтожаем задачу без выхода из команды top — нажимаем k
- •3. Переопределяем приоритет процесса без выхода из команды top — нажимаем r
- •4. Изображаем выбранного пользователя в выходных данных команды top — используем top -u
- •5. Изображаем все процессоры / ядра в выходных данных команды top — нажимаем 1 (один)
- •6. Обновление по требованию выходных данных команды top системы unix (или) изменение интервала обновления данных
- •7. Выделение работающих процессов в выходных данных команды top системы Linux — нажмите z или b
- •9. Выход из команды top после заданного числа итераций — используем top -n
- •10. Выполнение команды Top в потоковом режиме
- •12. Получение помощи Help команды Top в командной строке и интерактивно
- •13. Уменьшение числа процессов, выдаваемых в выходных данных команды top — нажмите n
- •14. Изменение заголовка данных, выдаваемых командой Top, и увеличение числа изображаемых процессов
- •15. Сохраните конфигурационные настройки команды top — нажмите w
Сигналы
В этом примере процесс lessвзаимодействует с процессомgrepпосредством механизма, который называетсянеименований каналили пайп (pipe- канал). Мы не будем вдаваться в подробности, просто запомните, что посредством символа|, который можно в данном случае называть “пайпом” информация (результат выполнения) процессаlessидет на вход другого процесса -grep. Таким образом один процесс передал информацию другому процессу.
Еще один способ общения процессов - это именованные каналы. Именованный канал можно создать командой mkfifo: $ mkfifo my_pipe $ ls -l | grep my_pipe prw-r–r– 1 igor igor 0 2009-11-09 17:59 my_pipe
Теперь в одной консоли выполните команду:
$ echo Hello > my_pipe
Как видите, команда не завершает свою работу, а ждет. Зарегистрируйтесь еще в одной консоли и выполните команду:
$ cat my_pipe Hello
Если вернуться на первую консоль, то вы увидите, что команда echoзавершила свою работу. Таким образом через именованный канал my_pipe команда (процесс)echoпередала информацию (словоHello) процессуcat, который ее принял и вывел на экран.
Задание 3. Изменить приоритет пользовательского процесса.
Сигналы.
Давайте теперь рассмотрим основной способ “общения” процессов - сигналы. Один процесс при помощи ядра может передать другому процессу специальное числовое значениесигнала. Процесс вызывает функцию передачисигналаи передает необходимую информацию (кодсигнала,PIDпроцесса) ядру. Ядро передаетсигналпроцессу получателю и отслеживает как этотсигналобрабатывается.Сигналыобозначаются цифрами или мнемоническими обозначениями. Переченьсигналовможно вывести командойkill -l.
Мнемонические имена которые вы видите (SIGTERM, SIGINT, SIGKILL) начинаются с приставкиSIG. Имена в этом виде используются в языках программирования таких какС. В интерпретатореbashиспользуются или числа или мнемонические имена, но без приставкиSIG-TERM, INT, KILL.
Часть сигналов(INT, TERM) являются перехватываемыми. Это означает, что процесс при получении такогосигналадолжен перейти на специальную подпрограмму, которая занимается обработкойсигнала. Если подпрограммы обработки нет (а ее написанием занимаются разработчики программы, которая выполняется в контексте процесса), то управление передается ядру, которое выполняет действия по умолчанию, описанные для каждогосигнала.
Часть сигналовявляются такими которые можно заблокировать. Например, один процесс посылаетсигнал TERMдругому процессу, а он в свою очередь не закончил операции ввода/вывода. В таком случае второй процесс может заблокировать полученныйсигнал(опять таки в обработчикесигнала) до момента выполнения необходимой операции ввода/вывода.Сигнал TERM- это сигнал корректного завершения работы процесса. Обработчик этогосигнала, должен выполнить все необходимые действия для правильного завершения работы.
И есть третья группа сигналов, которые не блокируются и для которых не нужны обработчики. Примером такого сигналаявляетсясигнал KILL. Этотсигналуничтожает процесс, так как для него нет обработчиков в процессах, то он будет обрабатываться ядром по умолчанию и так как он не блокируемый, то действия будут выполнятся немедленно.
Пока мы говорили о том как процессы “общаются” между собой с помощью сигналов. Но мы (пользователи) также можем посылатьсигналыпроцессам. Например, комбинация клавишCtrl+Cпосылает процессусигнал INT, который прерывает выполнение процесса. Если вы наберете в терминале командуsleep 100, то команда не вернет управление терминалу пока не завершится. Прервать выполнение этой команды можно нажав комбинацию клавишCtrl+C.
В чем же отличия между похожими сигналами INT, TERM, KILL(а такжеQUITиHUP)? Несмотря на похожесть отличия есть:
Сигнал KILLне блокируется и не перехватывается и ведет к немедленному завершению процесса.Сигнал INTв отличии отKILLявляется блокируемым сигналом и перехватываемым.Сигнал TERMтакже является перехватываемым и блокируемым и предназначен для корректного (предпочтительного) завершения работы процесса.Сигнал QUIT- похож наTERM, но позволяет сохранить дамп памяти.Сигнал HUP- сейчас этот сигнал чаще всего интерпретируется процессами как “прочесть конфигурационные файлы”.
Рассмотрим два сигнала:STOPиCONT.СигналSTOPостанавливает процесс, то есть процесс переходит в состояние “остановленный“. В таком состоянии процесс будет до тех пор пока снова не получитсигнал. Если будет полученсигнал CONT, то процесс возобновит свою работу с того момента как он был остановлен. Практический пример:
Задание 4.
Наберите в терминале команду sleep 1000 &.
Затем проверьте, что процесс находится в состоянии ожидания, о чем нам говорит буква Sв столбцеS:
$ top | grep [s]leep PID S TIME COMMAND 6301 S 0:00 sleep 1000
Теперь пошлем процессу сигнал STOP. Для этого используем командуkill(kill -название процесса PID процесса):
$ kill -STOP 6301 [1]+ Stopped sleep 1000
Проверяем статус процесса: $ top | grep [s]leep PID S TIME COMMAND 6301 T 0:00 sleep 1000
Видим, что процесс действительно находится в состоянии “остановленный” (символ Tв столбцеS).
Теперь отправим процессу сигнал продолжения работы (CONT) и проверим состояние: kill -CONT 6301 $ top | grep [s]leep PID S TIME COMMAND 6301 S 0:00 sleep 1000
Если необходимо корректно завершить процесс, то необходимо послать ему сигнал TERM: $ kill -TERM 6301 $ top | grep [s]leep [1]+ Terminated sleep 1000 $ top | grep [s]leep
Если сразу же после посылки сигнала TERMвыполнить командуtop x | grep [s]leep, то можно успеть увидеть сообщение о том, что процесс завершает работу, в при следующей попытке вывести информацию о нашем процессеsleepмы уже ничего не увидим - процесс прекратил существование. Командаkillбез указания сигнала, по умолчанию передает процессу именносигнал TERM. Поэтому можно было написать простоkill 6301.
Если необходимо срочно завершить процесс, или процесс не завершается по сигналу TERM, то тогда необходимо послать процессу сигнал KILL: $ sleep 1000 & [1] 6348 $ kill -KILL 6348 $ top | grep [s]leep [1]+ Killed sleep 1000
Если необходимо послать один и тот же сигнал нескольким процессам, то можно перечислить их через пробел: kill -TERM 2345 3456 4567.
Команда kill довольно ограничена в возможностях и не позволяет выполнять более сложные действия. Поэтому рассмотрим еще одну команду - killall. Основное преимущество этой команды, то что она умеет посылать сигналы всем процессам с одинаковым именем или всем процессам одного пользователя.
Запустите несколько раз подряд команду sleep 1000 &:
$ top | grep [s]leep 6460 S 0:00 sleep 1000 6461 S 0:00 sleep 1000 6462 S 0:00 sleep 1000 6463 S 0:00 sleep 1000 6464 S 0:00 sleep 1000 6465 S 0:00 sleep 1000 6466 S 0:00 sleep 1000
Теперь, чтобы завершить все процессы с именем sleep, достаточно набрать командуkillall sleep: $ killall sleep [1] Terminated sleep 1000 [2] Terminated sleep 1000 [3] Terminated sleep 1000 [4] Terminated sleep 1000 [6]- Terminated sleep 1000 [7]+ Terminated sleep 1000 [5]+ Terminated sleep 1000
Выполните команду sleep 1000 &еще несколько раз, а затем зарегистрируйтесь в другой консоли от имени другого пользователя (например, test) и также от его имени выполните командуsleep 1000 &. Теперь вернитесь в свою консоль и просмотрите процессыsleepвсех пользователей:
$ top | grep [s]leep igor 6540 0.0 0.0 2952 628 S 22:30 0:00 sleep 1000 igor 6541 0.0 0.0 2952 632 S 22:30 0:00 sleep 1000 igor 6542 0.0 0.0 2952 628 S 22:30 0:00 sleep 1000 test 6543 0.0 0.0 2952 632 S 22:30 0:00 sleep 1000 test 6544 0.0 0.0 2952 628 S 22:30 0:00 sleep 1000 test 6545 0.0 0.0 2952 628 S 22:30 0:00 sleep 1000 test 6546 0.0 0.0 2952 632 S 22:30 0:00 sleep 1000