Файлы DLL

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

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

Инструкция

Internet Protocol (IP) определяет доставку данных от одного узла сети до другого. При этом он не гарантирует точность доставки: пакеты при передаче могут теряться или поступать не в том порядке, в котором были отправлены. За точность отвечает протокол транс ного уровня Transmission Control Protocol – TCP. TCP устанавливает соединение, контролирует отправку и получение пакетов, дублирует свои действия в том случае, если ответ на запрос не получен или пакеты потерялись. Важно понимать, что TCP устанавливает обмен пакетами не просто между узлами, а между программными приложениями. Сетевой порт – это условное , число от 1 до 65535, которое указывает, какому приложению назначен пакет.

Узнать, какими процессами используются порты на компьютере, можно при помощи стандартных средств Windows. В меню «Пуск» нажмите «выполнить» и в командную строку введите cmd. Подтвердите ОК. В окне консоли наберите команду netstat -a -n -o.

В столбце PID указан номер процесса, в столбце « » - IP-адрес вашего компьютера и, через двоеточие, номер порта, который занят соответствующим процессом. «Внешний адрес» – это IP и номер порта удаленного узла, с которым работает какое-то приложение.

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

Можете получить эти сведения иначе: запустите "Диспетчер задач" из командной строки, набрав taskmgr, или комбинацией клавиш Ctrl+Alt+Delete. В столбце PID найдите номер интересующего вас процесса, в столбце «Имя образа» – название соответствующего приложения или службы. Если PID не отображается в окне Диспетчера, зайдите в пункт «Вид» главного меню и выбирайте опцию «Выбрать столбцы». Поставьте флаг рядом с пунктом «Идентиф.процесса (PID)».

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

Вам понадобится

  • - компьютер с ОС Windows (XP, Windows 7).

Инструкция

Нажмите на клавиатуре сочетание клавиш ctrl+alt+del. Если вашей операционной системой является Windows ХР, то диспетчер задач появится сразу, если же Windows 7 - появится окно, в котором его можно выбрать.

В выберите вкладку «Процессы». Теперь здесь же кликните по пункту «Вид». Появится дополнительное окно. В нем выберите параметр «Выбрать столбцы». Возникнет диалоговое окно, в котором самый верхний пункт будет называться «ИД процесса (pid)». Напротив него установите флажок. Сохраните настройки, нажав ОК.

Затем в диспетчере устройств пройдите во вкладку «Процессы», где вы увидите строку «ИД процесса ». Найдите в ней название процесса , идентификатор которого вам нужно узнать, и посмотрите его значение.

Теперь будет рассмотрено, это значение с помощью командной строки операционной системы. Нажмите кнопку «Пуск» и перейдите на вкладку «Все программы». Выберите «Стандартные программы». Здесь найдите пункт меню «Командная строка» и запустите его. Введите tasklist и нажмите клавишу Enter. После активации этой команды в окне командной строки появится список всех активных на данный момент процессов. После имени каждого из них будет написан его идентификатор.

Если вам необходимо быстро завершить процесс, то сделать это можно так. После того как вы узнаете идентификатор процесса , наберите в командной строке taskkill /pid 0000. Вместо нулей введите число идентификатора процесса , который требуется « ». После этого система отправит сигнал на его завершение, и он будет выключен.

Обратите внимание

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

Обращение к почтовым серверам в программе The Bat! (как и в других почтовых программах) происходит через определенные порты для отправки и приема почты. Чтобы настроить работу почтовой программы, вам надо внести в параметры ящика номера портов SMTP и POP3, а также названия серверов.

Вам понадобится

  • - данные от почты.

Инструкция

Зайдите на сайт вашего почтового сервера. Например, ваш почтовый сервер mail.ru. Вам потребуется авторизоваться - то есть ввести логин и пароль, - чтобы войти в личный почтовый ящик. Найдите ссылку на помощь и кликните по ней мышью.

Список разделов помощи находится слева. Кликните по надписи «Доступ из почтовых программ» и выберите первый пункт, чтобы загрузить страницу настроек. На странице указано, что название сервера входящей почты - pop.mail.ru, а сервера исходящей - smtp.mail.ru. Это относится только к данному сервису. Как правило, у каждого постового сервера могут быть разные порты, поэтому заходите на официальный сайт в центр поддержки и узнавайте данные. Также существуют в интернете сайты, которые предоставляют информацию практически по всем сервисам, которые существуют в интернете.

Номера портов серверов исходящей и входящей почты указаны внизу страницы. Там указано, что для сервера входящей почты протоколы имеют номера 110 (если почтовая программа работает без шифрования) и 995 (с шифрованием). Чтобы узнать, какую именно цифру вводить, изучите настройки вашей почтовой программы. Номер порта исходящей почты - 25, 587 или 2525 (если почтовая программа не использует шифрование) и 465 (с шифрованием). Стандартными почтовыми портами считаются 110 и 25. В программе также могут быть по умолчанию прописаны стандартные номера портов, поэтому при необходимости вам нужно будет их исправить на правильные.

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

TCP/IP – это совокупность протоколов , которая позволяет соединить индивидуальные компьютеры и сети в общую вычислительную сеть. При помощи протоколов TCP/IP большинство прикладных программ обмениваются информацией в сети Internet.



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


Предупреждение : смена PID - нестандартный процесс, и при определенных обстоятельствах может привести к панике ядра.

Наш тестовый модуль будет реализовывать символьное устройство /dev/test, при чтении с которого процессу будет изменен PID. За пример реализации символьного устройства спасибо этой статье. Полный код модуля приведен в конце статьи. Конечно, самым правильным решением было добавить системный вызов в само ядро, однако это потребует перекомпиляцию ядра.

Окружение

Все действия по тестированию модуля выполнялись в виртуальной машине VirtualBox с 64 битным дистрибутивомLInux и версией ядра 4.14.4-1. Связь с машиной осуществлялась с помощью SSH.

Попытка #1 простое решение

Пару слов о current : переменная current указывает на структуру task_struct с описанием процесса в ядре(PID, UID, GID, cmdline, namespaces и т.д)

Первой идеей было просто поменять параметр current->pid из модуля ядра на нужный.

Static ssize_t device_read(struct file *filp, char *buffer, size_t length, loff_t * offset) { printk("PID: %d.\n",current->pid); current->pid = 1; printk("new PID: %d.\n",current->pid); , }
Для проверки работоспособности модуля я написал программу на C++:

#include #include #include int main() { std::cout << "My parent PID " << getppid() << std::endl; std::cout << "My PID " << getpid() << std::endl; std::fstream f("/dev/test",std::ios_base::in); if(!f) { std::cout << "f error"; return -1; } std::string str; f >> str; std::cout << "My new PID " << getpid() << std::endl; execl("/bin/bash","/bin/bash",NULL); }
Загрузим модуль коммандой insmod, создадим /dev/test и попробуем.

# ./a.out My parent PID 293 My PID 782 My new PID 782
PID не изменился. Возможно, это не единственное место, где указывается PID.

Попытка #2 дополнительные поля PID

Если не current->pid является идентификатором процесса, то что является? Быстрый просмотр кода getpid() навел на структуру task_struct , описывающую процесс Linux и файл pid.c в исходном коде ядра. Нужная функция - __task_pid_nr_ns. В коде функции встречается обращение task->pids.pid, этот параметр мы и изменим

Компилируем, пробуем

Так как тестировал я по SSH, мне удалось получить вывод программы до падения ядра:

My parent PID 293 My PID 1689 My new PID 1689
Первый результат, уже что-то. Но PID все равно не изменился.

Попытка #3 не экспортируемые символы ядра

Более внимательное изучение pid.c дало функцию, которая делает то, что нам нужно
static void __change_pid(struct task_struct *task, enum pid_type type,
struct pid *new)
Функция принимает задачу, для которой надо изменить PID, тип PID и, собственно, новый PID. Созданием нового PID занимается функция
struct pid *alloc_pid(struct pid_namespace *ns)

Эта функция принимает только пространство имен, в котором будет находиться новый PID, это пространство можно получить с помощью task_active_pid_ns .
Но есть одна проблема: эти символы ядра не экспортируются ядром и не могут использоваться в модулях. В решении этой проблемы мне помогла замечательная . Код функции find_sym взят оттуда.

Static asmlinkage void (*change_pidR)(struct task_struct *task, enum pid_type type, struct pid *pid); static asmlinkage struct pid* (*alloc_pidR)(struct pid_namespace *ns); static int __init test_init(void) { printk(KERN_ALERT "TEST driver loaded!\n"); change_pidR = find_sym("change_pid"); alloc_pidR = find_sym("alloc_pid"); ... } static ssize_t device_read(struct file *filp, char *buffer, size_t length, loff_t * offset) { printk("PID: %d.\n",current->pid); struct pid* newpid; newpid = alloc_pidR(task_active_pid_ns(current)); change_pidR(current,PIDTYPE_PID,newpid); printk("new PID: %d.\n",current->pid); ... }
Комплируем, запускаем

My parent PID 299 My PID 750 My new PID 751
PID изменен! Ядро автоматически выделило нашей программе свободный PID. Но можно ли использовать PID, который занял другой процесс, например PID 1? Добавим после аллокации код

Newpid->numbers.nr = 1;
Комплируем, запускаем

My parent PID 314 My PID 1172 My new PID 1
Получаем настоящий PID 1!

Bash выдал ошибку, из-за которой не будет работать переключение задач по комманде %n, но все остальные функции работают отлично.

Интересные особенности процессов с измененным PID

PID 0: войти нельзя выйти

Вернемся к коду и изменим PID на 0.

Newpid->numbers.nr = 0;
Комплируем, запускаем

My parent PID284 My PID 1517 My new PID 0
Выходит PID 0 не такой и особенный? Радуемся, пишм exit и…

Ядро падает! Ядро определило нашу задачу как IDLE TASK и, увидев завершение, просто упало. Видимо, перед завершением наша программа должна вернуть себе «нормальный» PID.

Процесс-невидимка

Вернемся к коду и выставим PID, гарантированно не занятый
newpid->numbers.nr = 12345;

Комплируем, запускаем

My parent PID296 My PID 735 My new PID 12345
Посмотрим, что находится в /proc

1 148 19 224 288 37 79 86 93 consoles fb kcore locks partitions swaps version 10 149 2 226 29 4 8 87 acpi cpuinfo filesystems key-users meminfo sched_debug sys vmallocinfo 102 15 20 23 290 5 80 88 asound crypto fs keys misc schedstat sysrq-trigger vmstat 11 16 208 24 291 6 81 89 buddyinfo devices interrupts kmsg modules scsi sysvipc zoneinfo 12 17 21 25 296 7 82 9 bus diskstats iomem kpagecgroup mounts self thread-self 13 176 210 26 3 737 83 90 cgroups dma ioports kpagecount mtrr slabinfo timer_list 139 18 22 27 30 76 84 91 cmdline driver irq kpageflags net softirqs tty 14 182 222 28 31 78 85 92 config.gz execdomains kallsyms loadavg pagetypeinfo stat uptime
Как видим /proc не определяет наш процесс, даже если мы заняли свободный PID. Предыдущего PID тоже нет в /proc, и это весьма странно. Возможно, мы находимся в другом пространстве имен и поэтому не видны основному /proc. Смонтируем новый /proc, и посмотрим что там

1 14 18 210 25 291 738 81 9 bus devices fs key-users locks pagetypeinfo softirqs timer_list 10 148 182 22 26 296 741 82 90 cgroups diskstats interrupts keys meminfo partitions stat tty 102 149 19 222 27 30 76 83 92 cmdline dma iomem kmsg misc sched_debug swaps uptime 11 15 2 224 28 37 78 84 93 config.gz driver ioports kpagecgroup modules schedstat sys version 12 16 20 226 288 4 79 85 acpi consoles execdomains irq kpagecount mounts scsi sysrq-trigger vmallocinfo 13 17 208 23 29 6 8 86 asound cpuinfo fb kallsyms kpageflags mtrr self sysvipc vmstat 139 176 21 24 290 7 80 87 buddyinfo crypto filesystems kcore loadavg net slabinfo thread-self zoneinfo
По прежнему нашего процесса нет, а значит мы в обычном пространстве имен. Проверим

Ps -e | grep bash
296 pts/0 00:00:00 bash

Только один bash, с которого мы и запускали программу. Ни предыдущего PID, ни текущего в списке нет.

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

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

В этой статье будет затронута обширная тема, мы рассмотрим такие возможности:

  • Просмотр запущенных процессов
  • Просмотр информации о процессах
  • Поиск процессов в Linux
  • Изменение приоритета процессов
  • Завершение процессов
  • Ограничение памяти доступной процессу

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

Начнем с того, что разберемся в терминах. По сути, процесс - это каждая программа. Как я уже говорил для каждой запускаемой программы создается отдельный процесс. В рамках процесса программе выделяется процессорное время, оперативная память и другие системные ресурсы. У каждого процесса есть свой идентификатор, Proccess ID или просто PID, по ним, чаще всего и определяются процессы Linux. PID определяется неслучайно, как я уже говорил, программа инициализации получает PID 1, а каждая следующая запущенная программа - на единицу больше. Таким образом PID пользовательских программ доходит уже до нескольких тысяч.

На самом деле, процессы Linux не настолько абстрактны, какими они вам сейчас кажутся. Их вполне можно попытаться пощупать. Откройте ваш файловый менеджер, перейдите в корневой каталог, затем откройте папку /proc. Видите здесь кучу номеров? Так вот это все - PID всех запущенных процессов. В каждой из этих папок находится вся информация о процессе.

Например, посмотрим папку процесса 1. В папке есть другие под каталоги и много файлов. Файл cmdline содержит информацию о команде запуска процесса:

cat /proc/1/cmdline

/usr/lib/systemd/systemd

Поскольку у меня используется система инициализации Systemd, то и первый процесс запускается для нее. С помощью каталога /proc можно сделать все. Но это очень неудобно, особенно учитывая количество запущенных процессов в системе. Поэтому для реализации нужных задач существуют специальные утилиты. Перейдем к рассмотрению утилит, которые позволяют реализовать управление процессами в Linux.

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

В Linux есть очень большое количество утилит для решения различных задач по управлению процессами. Это и такие многофункциональные решения, как htop, top, а также простые утилиты, например, ps, kill, killall, who и т д. Я не буду рассматривать в этой статье графические утилиты, и top тоже рассматривать не буду. Первое потому что слишком просто, второе - потому что htop лучше. Мы остановимся на работе с программой htop и ее аналогами в форме утилит в стиле GNU, одна утилита - одна функция.

Давайте установим htop, если она у вас еще не установлена. В Ubuntu это делается так:

sudo apt install htop

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

Посмотреть запущенные процессы

Это очень простая задача, и также просто она решается. Для этого существует множество утилит, начиная от обычной ps, до более продвинутых интерактивных top, htop и так далее.

Открыв htop, мы сразу видим список запущенных процессов. Конечно, здесь отображены не все процессы linux, их-то в системе очень много, вы уже знаете, все они на один экран не поместятся. По умолчанию выводятся процессы, запущенные от имени вашего пользователя:

Вы можете увидеть такую информацию о процессе:

  • PID - идентификатор процесса
  • USER - пользователь, от которого был запущен процесс
  • PRI - приоритет процесса linux на уровне ядра (обычно NI+20)
  • NI - приоритет выполнения процесса от -20 до 19
  • S - состояние процесса
  • CPU - используемые ресурсы процессора
  • MEM - использованная память
  • TIME - время работы процесса

К отображению можно добавить и дополнительные параметры, но эти главные. Добавить параметры можно с помощью меню Setup. Там все очень просто, читайте подсказки и следуйте указаниям. Например, добавлен параметр PPID:

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

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

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

Рассмотрим основные опции, которые будем использовать:

  • -e - вывести информацию обо всех процессах
  • -a - вывести информацию обо всех наиболее часто запрашиваемых процессах
  • -t - показывать только процессы из этого терминала
  • -p - показывать информацию только об указанном процессе
  • -u - показывать процессы только определенного пользователя

Одним словом, чтобы посмотреть все активные на данный момент процессы в linux, используется сочетание опций aux:

Программа показывает все те же параметры, только здесь нет интерактивного интерфейса. Думаете здесь нельзя отсортировать процессы, но ошибаетесь, можно. Для этого есть опция sort. Вы можете сортировать их по любому полю, например:

ps aux --sort=%mem

Список будет отсортирован в обратном порядке, внизу значения больше, вверху - меньше. Если нужно в обратном порядке, добавьте минус:

ps aux --sort=-%cpu

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

Казалось бы, у ps нет возможности стоить деревья процессов. Но не совсем, для этого существует отдельная команда:

Поиск процессов в Linux

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

Чтобы найти процесс linux в htop можно использовать кнопку F3. Нажмите F3 и наберите нужное слово. Дальше чтобы перейти к следующему вхождению нажимайте F2 или Esc для завершения поиска:

Для поиска процессов в htop можно использовать также фильтр htop. Нажмите F4, введите слово и будут выведены только процессы linux, имя которых включает это слово.

В утилите ps фильтрации нет, но зато мы можем использовать утилиту grep, перенаправив вывод ps на нее чтобы найти процесс linux:

ps aux | grep chromium

Это очень часто употребляемая команда.

Изменение приоритета процессов

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

В htop для управления приоритетом используется параметр Nice. Напомню, что Priv, это всего лишь поправка, она в большинстве случаев больше за Nice на 20. Чтобы изменить приоритет процесса просто установите на него курсор и нажимайте F7 для уменьшения числа (увеличения приоритета) или F8 - для увеличения числа.

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

nice -n 10 apt-get upgrade

Или изменить приоритет для уже существующего по его pid:

renice -n 10 -p 1343

Завершение процессов в Linux

Если процесс завис и не отвечает, его необходимо завершить. В htop, чтобы убить процесс Linux, просто установите курсор на процесс и нажмите F9:

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

  • SIGKILL - попросить процесс сохранить данные и завершится
  • SIGTERM - завершить процесс немедленно, без сохранения

Вообще сигналов есть несколько десятков, но мы не будем их рассматривать. Отправим сигнал SIGKILL:

Также можно воспользоваться утилитой kill:

Также можно уничтожить процесс по имени:

killall chromium

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

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

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

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

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

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

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

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

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

sergiy hard nproc 20

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

cat /proc/PID/limits

Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 204800 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 23562 23562 processes
Max open files 1024 4096 files
Max locked memory 18446744073708503040 18446744073708503040 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 23562 23562 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us

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

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

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

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

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

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

ulimit -Sv 500000

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

Выводы

Вот и все. Теперь управление процессами в Linux не вызовет у вас проблем. Мы рассмотрели очень даже подробно эту тему. Если у вас остались вопросы или есть предложения по дополнению статьи, пишите в комментариях!

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

Идентификатор родительского процесса (ррid)

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

Исходный процесс в терминологии ОС UNIX называют родительским, а его клон – порожденным. Помимо собственного идентификатора, каждый процесс имеет атрибут РРID, т.е. идентификатор своего родительского процесса.

Идентификатор пользователя (uid) и эффективный идентификатор пользователя (euid)

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

EUID– это «эффективный»UIDпроцесса. ЕUIDиспользуется для того, чтобы определить, к каким ресурсам и файлам у процесса есть право доступа. У большинства процессовUIDи ЕUID будут одинаковыми. Исключение составляют программы, у которых установлен бит смены идентификатора пользователя (см. обSUIDв разделе, посвященном установлению прав доступа на файлы и каталоги).

Идентификатор группы (gid) и эффективный идентификатор группы (egid)

GID– это идентификационный номер группы данного процесса. Допустимые идентификаторы групп указываются в файле/ etc / group и в поле GID файлаtc / passwd . Когда процесс запускается, егоGIDустанавливается равнымGIDродительского процесса.

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

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

Приоритет и значениеnice

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

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

Жизненный цикл процесса

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

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

    у нового процесса свой PID;

    PPIDнового процесса равенPIDродителя;

    учетная информация нового процесса обнулена;

    у нового процесса имеется свой собственный экземпляр дескрипторов файлов.

Когда система загружается, ядро самостоятельно создает несколько процессов. Наиболее важный из них – процесс (демон) init ,PIDкоторого всегда равен 1. Этот процесс отвечает за вызовshellдля выполнения сценариев запускаrc , если Ваша система их использует. Все процессы, кроме тех, которые создает ядро, являются потомкамиinit .

После обработки файлов запуска процесс init запускает для каждого виртуального терминала процессgetty .

Процесс init играет важную роль и в управлении процессами. Когда процесс завершается, он вызывает подпрограмму_ exit , чтобы уведомить ядро о своей готовности «умереть». В качестве параметра подпрограмме_ exit передаетсякод завершения – целое число, указывающее на причину завершения процесса. По соглашению нулевой код завершения означает, что процесс был «успешным».

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

Этот механизм работает нормально, если родительский процесс завершается позже порожденных им процессов и добросовестно вызывает wait для того, чтобы все процессы - зомби умерли. Если же родительский процесс умирает первым, то ядро понимает, что вызоваwait не последует, и дарит всех зомби процессуinit . Процессinit обязан принять этих «осиротевших» зомби и выполнить вызовwait , необходимый для того, чтобы ликвидировать их. Иногдаinit не выполняет свои обязанности как следует, и зомби остаются в системе. Но каких-либо проблем при этом они не создают.

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

1. Что такое PID

Прежде чем мы начнем, мы должны знать, что такое ID процесса (PID).

PID представляет собой цифровую идентификацию процесса в . Каждый процесс имеет уникальный PID. В самом деле, например, первый процесс, который начинается в системе на базе Linux, это процесс, и его PID устанавливается в 1. Этот процесс является родителем всех остальных процессов. Процесс инициализации не может быть убит с помощью команд kill, и это гарантирует, что это не будет случайно убит.

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

Это дает нам список всех запущенных процессов и их соответствующие PIDы.

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

Pidof mysql

Для еще более подробной информации, мы можем использовать команду ps aux вместе с grep :

Ps aux | grep mysql

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

2. Убить процесс с помощью команды kill в Linux

Есть несколько важных правил, которые мы должны знать, прежде чем начать использовать команду kill.

  • Вы можете убить только собственные процессы, которые принадлежат вашему идентификатору пользователя
  • Вы не можете убивать процессы других пользователей
  • Вы не можете убить системные процессы (если вы не суперпользователь)
  • Пользователь root может убить процесс любого другого пользователя и любой системный процесс

Когда мы убиваем процесс с командой kill, мы на самом деле отправляем конкретный сигнал PID-регулятор, который мы хотим убить. Следующие сигналы используются командой kill:

1 = Hung up 9 = Kill 15 = Terminate

Сигнал hung up используется редко. Чаще всего мы используем сигнал kill, и если он не работает, то мы можем использовать сигнал Terminate.

Поэтому, как только мы находим PID процесса, который мы хотим убить, используйте один из методов, описанных нами ранее, мы можем использовать команду kill -9 PID , чтобы убить процесс с этого конкретного PID.

Например, если PID равный 6738, то мы можем использовать следующую команду:

Kill -9 6738

3. Убить процесс с помощью команды pkill в Linux

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

Pkill mysql

4. Убить процесс с помощью команды killall в Linux

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

Killall mysql

В этом примере мы убьем процесс MySQL и все его дочерние процессы.

Они являются наиболее распространенными примерами убийства процесса в Linux.