Процессы в Linux, взаимодействие процессов

Ноябрь 10th, 2010 Рубрики: Linux, основы Linux

Работа процессов linux, взаимодйствие процессов, управление процессами в linuxДоброго времени, гости моего блога! В сегодняшнем посте расскажу о том, как работают процессы в ОC Linux, а так же как управлять этими самыми процессами, о выполнении процессов в фоне, о повышении/понижении приоритета процессов.

В общем представлении, процесс - это программа, выполняющаяся в оперативной памяти компьютера. Реально, все гораздо сложней.

В многозадачной системе может быть запущено множество программ. Каждая программа может запустить множество процессов (читай: подпрограмм). При этом в единственный момент на машине, выполняется только 1 процесс. То есть в единственный момент времени ресурсы железа (процессорное время, память, порт ввода/вывода) может использоваться только единственным процессом. Очередью, в которой процессу выделяется определенный ресурс железа, управляет планировщик.  При этом, во время прерывания одного процесса и запуска (возобновления) другого процесса, состояние процесса (выполняемые действия, на каком этапе процесс приостановлен) запоминается и записывается в область памяти. Планировщик в Linux - это часть ядра, отвечающая за указанную функциональность. В задачи планировщика так же входит отслеживание и выделение запускаемым процессам определенного приоритета, чтобы процессы "не мешали" друг-другу работать, а так же распределение пространства памяти, чтобы пространство памяти одного процесса не пересекалось с пространством другого.

Все новые процессы в Linux порождаются клонированием какого-то уже имеющегося процесса, с помощью вызова системных функций clone(2) и fork(2) (от forking - порождение). У нового (порожденного или дочернего) процесса тоже окружение, что и у родителя, отличается только номер ID процесса (т.н. PID).  Жизнь типичного процесса в Linux можно представить следующей схемой:

На которой можно описать пошагово следующие этапы:

  • процесс /bin/bash клонирует себя системным вызовом fork()
  • при этом создается клон /bin/bash с новым PID (идентификатор процесса) и PPID - равный PID родителя
  • Клон выполняет системный вызов exec с указанием на исполняемый файл и заменяет свой код - кодом исполняемого файла (родительский процесс при этом ждет завершения потомка - wait)
    • при этом, если по каком-то причинам, потомок завершил свою работу, а родительский процесс не смог получить об этом сигнал, то данный процесс (потомок) не освобождает занятые структуры ядра и состояние процесса становиться - zombie. О состояниях процесса ниже...

Очень наглядную схему предоставила википедия:

Состояния процессов Linux

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

Первый процесс в системе запускается при инициализации ядра. Данный процесс называется - init и имеет PID=1. Это прородитель всех процессов в системе.  Подробнее о процессе загрузки ядра и рождении процесса init можно почитать тут.

В каких же состояниях может находиться процесс в Linux?

Каждый запущенный процесс в любой момент времени находится в одном из следующих состояний (которое называют еще статусом процесса):

  • Активен (R=Running) – процесс находится в очереди на выполнение, то есть либо выполняется в данный момент, либо ожидает выделения ему очередного кванта времени центрального процессора.
  • «Спит» (S=Sleeping) – процесс находится в состоянии прерываемого ожидания, то есть ожидает какого-то события, сигнала или освобождения нужного ресурса.
  • Находится в состоянии непрерываемого ожидания (D=Direct) – процесс ожидает определенного («прямого») сигнала от аппаратной части и не реагирует на другие сигналы;
  • Приостановлен (T) – процесс находится в режиме трассировки (обычно такое состояние возникает при отладке программ).
  • «Зомби» (Z=Zombie) – это процесс, выполнение которого завершилось, но относящиеся к нему структуры ядра по каким-то причинам не освобождены. Одной из причин их появления в системе может быть следующая ситуация. Обычно освобождение структур ядра, относящихся к процессу, выполняет процесс-родитель после получения от потомка сигнала о завершении. Но бывают случаи, когда родительский процесс завершается раньше дочернего. Процессы, не имеющие родителя, называются "сиротами". "Сироты" автоматически усыновляются процессом init, который и принимает сигналы об их завершении. Если процесс-родитель или init по каким-то причинам не может принять сигнал о завершении дочернего процесса, то процесс-потомок превращается в "зомби" и получает статус Z. Процессы-зомби не занимают процессорного времени (т. е. их выполнение прекращается), но соответствующие им структуры ядра не освобождаются. В некотором смысле это «мертвые» процессы. Уничтожение таких процессов — одна из обязанностей системного администратора. Хочу отметить, что появление данных процессов говорит о том, что в системе что-то не в порядке, и скорее всего не в порядке с аппаратной частью, так что берем memtest и MHDD и тестим-тестим. Не исключен вариант и кривого кода программы.

Так же, говоря о процессах в линуксе, можно выделить особый вид процессов - демоны. Данный вид процессов работает в фоне (подобно службам в Windows), без терминала и выполняет задачи для других процессов. Данный вид процессов на серверных системах является основным.

Т.к. в большинстве случаев, демоны в Linux простаивают и ожидают поступления каких-либо данных, соответственно, нужны относительно редко, так что держать их в памяти постоянно загруженными и расходовать на это ресурсы системы нерационально. Для организации работы демонов придуман демон inetd или его более защищенная модификация xinetd (eXtended InterNET Daemon или расширенный Интернет демон). В функции inetd (Xinetd) можно выделить:

  • установить ограничение на количество запускаемых серверов (служб, демонов)
  • наблюдение за соединениями на определенных портах и обработка входящих запросов
  • ограничение доступа к сервисам на основе ACL (списков контроля доступа)

Все процессы в системе, не важно Linux это или другая ОС, обмениваются между собой какой-либо информацией. Отсюда можно задать вопрос, а как же происходит межПРОЦЕССный обмен?

В ОС LINUX существует несколько видов можпроцессного обмена, а точнее сказать средств межпроцессного взаимодействия (Interprocess Communication - IPC), которые можно разбить на несколько уровней:

локальный (привязаны к процессору и возможны только в пределах компьютера);

-- каналы

  1. pipe (они же конвейеры, так же неименованные каналы), о них я много рассказывал в прошлом посте, примером можно привести: команда1 | команда2. По сути, pipe использует stdin, stdout и stderr.
  2. Именованные каналы (FIFO: First In First Out). Данный вид канала создаётся с помощью mknod или mkfifo, и два различных процесса могут обратиться к нему по имени. Пример работы с fifo:

в первом терминале (создаем именованный канал в виде файла pipe и из канала направляем данные с помощью конвейера в архиватор):

[root@proxy 1]# mkfifo pipe
[root@proxy 1]# ls -l
total 0
prw-r--r-- 1 root root 0 Nov  9 19:41 pipe
[root@proxy 1]# gzip -9 -c < pipe > out

во втором терминале (отправляем в именованный канал данные):

[root@proxy 1]# cat /path/to/file > pipe

в результате это приведет к сжатию передаваемых данных gzip-ом

-- сигналы

  • с терминала, нажатием специальных клавиш или комбинаций (например, нажатие Ctrl-C генерирует SIGINT, а Ctrl-Z SIGTSTP);
  • ядром системы:
    • при возникновении аппаратных исключений (недопустимых инструкций, нарушениях при обращении в память, системных сбоях и т. п.);
    • ошибочных системных вызовах;
    • для информирования о событиях ввода-вывода;
  • одним процессом другому (или самому себе), с помощью системного вызова kill(), в том числе:
    • из шелла, утилитой /bin/kill.

сигнал — это асинхронное уведомление процесса о каком-либо событии. Когда сигнал послан процессу, операционная система прерывает выполнение процесса. Если процесс установил собственный обработчик сигнала, операционная система запускает этот обработчик, передав ему информацию о сигнале. Если процесс не установил обработчик, то выполняется обработчик по умолчанию.
Все сигналы начинаются на «SIG…» и имеют числовые соответствия, определяемые в заголовочном файле signal.h. Числовые значения сигналов могут меняться от системы к системе, хотя основная их часть имеет в разных системах одни и те же значения. Утилита kill позволяет задавать сигнал как числом, так и символьным обозначением.
Сигналы можно послать следующими способами:

-- разделяемая память

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

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

-- очереди сообщений

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

удаленный;

-- удаленные вызовы процедур (Remote Procedure Calls - RPC)

RPC — разновидность технологий, которая позволяет компьютерным программам вызывать функции или процедуры в другом адресном пространстве (как правило, на удалённых компьютерах). Обычно, реализация RPC технологии включает в себя два компонента: сетевой протокол (чаще TCP и UDP, реже HTTP) для обмена в режиме клиент-сервер и язык сериализации объектов (или структур, для необъектных RPC).

-- сокеты Unix

Сокеты UNIX бывают 2х типов: локальные и сетевые. При использовании локального сокета, ему присваивается UNIX-адрес и просто будет создан специальный файл (файл сокета) по заданному пути, через который смогут сообщаться любые локальные процессы путём простого чтения/записи из него. Сокеты представляют собой виртуальный объект, который существует, пока на него ссылается хотя бы один из процессов. При использовании сетевого сокета, создается абстрактный объект привязанный к слушающему порту операционной системы и сетевому интерфейсу,  ему присваивается INET-адрес, который имеет адрес интерфейса и слушающего порта.

высокоуровневый

  1. Обычно - пакеты программного обеспечения, которые реализуют промежуточный слой между системной платформой и приложением. Эти пакеты предназначены для переноса уже испытанных протоколов коммуникации приложения на более новую архитектуру. Примером можно привести: DIPC, MPI и др. (мне не знакомы, честно говоря)

Итак. Подведем маленький итог:

  • В Linux есть процессы,
  • каждый процесс может запускать подпроцессы (нити),
  • создание нового процесса создается клонированием исходного,
  • прородителем всех процессов в системе является процесс init, запускаемый ядром системы при загрузке.
  • процессы взаимодействуют между собой по средствам можпроцессного взаимодействия:
    • каналы
    • сигналы
    • сокеты
    • разделяемая память
  • каждый процесс обладает свойствами (читай: обладает следующим контекстом):
    • PID - идентификатор процесса
    • PPID - идентификатор процесса, породившего данный
    • UID и GID - идентификаторы прав процесса (соответствует UID и GID  пользователя, от которого запущен процесс)
    • приоритет процесса
    • состояние процесса (выполнение, сон и т.п.)
    • так же у процесса есть таблица открытых (используемых) файлов

Далее поговорим о том, как посмотреть состояние процессов в Linux и о том, как же ими управлять.

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

Получение информации о процессе

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

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

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

# ps aux

Прокомментируем некоторые интересные моменты. Можно заметить, что некоторые процессы указаны в квадратных скобках [ ] – это процессы, которые входят непосредственно в состав ядра и выполняют важные системные задачи, например, такие как управление буферным кэшем [pdflush] и организацией свопинга [kswapd]. С ними лучше не экспериментировать – ничего хорошего из этого не выйдет :). Остальная часть процессов относится к пользовательским.

Какую информацию можно получить по каждому процессу (комментарии к некоторым полям):

  • PID, PPID – идентификатор процесса и его родителя.
  • %CPU – доля процессорного времени, выделенная процессу.
  • %MEM – процент используемой оперативной памяти.
  • VSZ – виртуальный размер процесса.
  • TTY – управляющий терминал.
  • STAT– статус процесса:
    • R – выполняется;
    • S – спит;
    • Z – зомби;
    • < – Повышенный приоритет;
    • + – Находится в интерактивном режиме.
  • START – время запуска.
  • TIME – время исполнения на процессоре.

Команда ps делает моментальный снимок процессов в текущий момент. В отличии от нее, команда top - динамически выводит состояние процессов и их активность в реальном режиме времени.

Пример вывода команды top:

14:32:49 up 35 days,  6:01,  4 users,  load average: 0.65, 0.51, 0.49
Tasks: 432 total,   1 running, 431 sleeping,   0 stopped,   0 zombie
CPU0  :  1.6%us,  3.6%sy,  0.0%ni, 85.3%id,  9.2%wa,  0.0%hi,  0.3%si,  0.0%st
CPU1  :  0.9%us,  1.9%sy,  0.0%ni, 96.9%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st
Mem:   1033596K total,  1016644K used,    16952K free,    82928K buffers
Swap:  2096376K total,    12632K used,  2083744K free,   478220K cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 2788 root      15  -5     0    0    0 S  2.0  0.0 404:43.97 md3_raid1
 7961 root      20   0  5964 2528 1684 R  2.0  0.2   0:00.14 top
 6629 root      20   0  8612 2884 2096 S  0.7  0.3   0:00.96 dovecot-auth
   57 root      15  -5     0    0    0 S  0.3  0.0   4:36.10 kblockd/0
 8703 ulogd     20   0 17700 4216  656 S  0.3  0.4  87:23.98 ulogd
11336 ldap      20   0  394M  15M 8292 S  0.3  1.5   5:29.28 slapd
25757 ldap      20   0  394M  15M 8292 S  0.3  1.5   5:11.71 slapd
10991 root      20   0  2188 1004  588 S  0.3  0.1   4:23.33 dovecot
    1 root      20   0  1712  516  464 S  0.0  0.0   0:46.17 init
    2 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 kthreadd
    3 root      RT  -5     0    0    0 S  0.0  0.0   0:05.92 migration/0
.....
 2960 root      16  -4  1980  520  392 S  0.0  0.1   0:10.04 udevd
 2993 dovecot   20   0  4412 1800 1476 S  0.0  0.2   0:00.00 pop3-login
 2994 dovecot   20   0  4412 1800 1476 S  0.0  0.2   0:00.02 pop3-login

В верхней части вывода отображается астрономическое время, время, прошедшее с момента запуска системы, число пользователей в системе, число запущенных процессов и число процессов, находящихся в разных состояниях, данные об использовании ЦПУ, памяти и свопа. А далее идет таблица, характеризующая отдельные процессы. Число строк, отображаемых в этой таблице, определяется размером окна: сколько строк помещается, столько и выводится.

Содержимое окна обновляется каждые 5 секунд. Список процессов может быть отсортирован по используемому времени ЦПУ (по умолчанию), по использованию памяти, по PID, по времени исполнения. Переключать режимы отображения можно с помощью следующих клавиатурных команд:

  • <Shift>+<N> — сортировка по PID;
  • <Shift>+<A> — сортировать процессы по возрасту;
  • <Shift>+<P> — сортировать процессы по использованию ЦПУ;
  • <Shift>+<M> — сортировать процессы по использованию памяти;
  • <Shift>+<T> — сортировка по времени выполнения.

С помощью команды <K> можно завершить некоторый процесс (его PID будет запрошен), а с помощью команды <R> можно переопределить значение nice для некоторого процесса.

Полезную информацию, так же, позволяет получить программа lsof, которая выдает список всех файлов, используемых сейчас процессами, включая каталоги, занятые потому, что какой-либо процесс использует их в качестве текущего или корневого; разделяемые библиотеки, загруженные в память; и т. д.

Итак, теперь об управлении процессами.

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

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

[root@proxy 1]# nice [- adnice] command [args]

где adnice — значение (от –20 до +19), добавляемое к значению nice процесса-родителя. Отрицательные значения может устанавливать только суперпользователь. Если опция adnice не задана, то по умолчанию для процесса-потомка устанавливается значение nice, увеличенное на 10 по сравнению со значением nice родительского процесса.

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

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

[root@proxy 1]# kill [-SIG] PID [PID..]

где SIG — это номер сигнала или наименование сигнала, причем если указание сигнала опущено, то посылается сигнал 15 (SIGTERM — программное завершение процесса). Часто используется сигнал 9 (KILL), с помощью которого суперпользователь может завершить любой процесс. Но сигнал этот очень "грубый", если можно так выразиться, потому что он просто «убивает» процесс, не давая ему времени на корректное сохранение всех обработанных данных. Поэтому в большинстве случаев рекомендуется использовать сигналы TERM или QUIT, которые завершают процесс более "мягко". Если процессу необходимо как-то по-особенному реагировать на сигнал, он может зарегистрировать обработчик, а если обработчика нет, за него отреагирует система.

Два сигнала – 9 ( KILL ) и 19 ( STOP ) – всегда обрабатывает система. Первый из них нужен для того, чтобы убить процесс наверняка (отсюда и название). Сигнал STOP приостанавливает процесс: в таком состояниипроцесс не удаляется из таблицы процессов, но и не выполняется до тех пор, пока не получит сигнал 18 ( CONT) – после чего продолжит работу. В Linux сигнал STOP можно передать активному процессу с помощью управляющего символа " ^Z ".

Обычные пользователи могут посылать сигналы только тем процессам, для которых они являются владельцами. Если в команде kill воспользоваться идентификатором процесса (PID), равным -1, то указанный в команде сигнал будет послан всем принадлежащим данному пользователю процессам. Суперпользователь root может посылать сигналы любым процессам. Когда суперпользователь посылает сигнал идентификатору -1, он рассылается всем процессам, за исключением системных. Если этим сигналом будет SIGKILL, то у простых пользователей будут потеряны все открытые ими, но не сохраненные файлы данных.

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

В оболочке bash имеются две встроенные команды, которые служат для перевода процессов на передний план или возврата их в фоновый режим. Команда fg переводит указанный в аргументе процесс на передний план, а команда bg — переводит процесс в фоновый режим. Одной командой bg можно перевести в фоновый режим сразу несколько процессов, а вот возвращать их на передний план необходимо по одному. Аргументами команд fg и bg могут являться только номера заданий, запущенных из текущего экземпляра shell. Возможные значения заданий можно увидеть, выполнив команду jobs.

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

[root@proxy 1]# nohup команда &

Запущенный таким образом процесс будет игнорировать посылаемые ему сигналы (не игнорируются только сигналы SIGHUP и SIGQUIT). Хочу так же выделить команду pstree, которая показывает дерево процессов. Очень наглядно, кстати.

Ну вот. как-то так. Буду рад любым комментариям и дополнениям.

Upd 2011.11.19: небольшой рестайлинг и дополнение информации о сигналах.

С Уважением, Mc.Sim!




Теги: , , , , , , , ,

25 комментариев к “Процессы в Linux, взаимодействие процессов”

  1. Февраль 18th, 2012 at 15:16
    1

    ОФИГЕТЬ!!! Я ИСКАЛ ЕДИНСТВЕННУЮ КОМАНДУ — nohup! СПАСИБО БОЛЬШОЕ! ВСЕ ПРОЦЕССЫ ЗАКРЫВАЛИСЬ ПОСЛЕ ОЧОНЧАНИЯ СЕССИИ!

    • Февраль 18th, 2012 at 15:19
      2

      Пожалуйста! Приходите еще!

  2. Июль 20th, 2012 at 13:47
    3

    Вопрос на засыпку!
    Есть сервер. На нем стоит линукс. В автозагрузку добавлена программа, управление которой проиходит непосредственно через stdin и sdtout. Можно ли как нибудь удаленно управлять программой имея доступ по ssh, или как нибудь перехватить управление дескрипторами ввода\вывода.?

    Пробовал через mkfifo pipe, неполучилось послать обычную команду на выполнение, зато отлично посылается результат работы программы или простой текст!

    Буду очень благодарен если поможете!!!

    Заранее большое спасибо

    • Июль 29th, 2012 at 12:17
      4

      Юрий, доброго времени. Что в данном контексте понимается под «В автозагрузку добавлена». В линукс есть уйма способов добавить что-то в автозагрузку.

      • aleks
        Октябрь 10th, 2012 at 17:31
        5

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

        • Октябрь 13th, 2012 at 00:39
          6

          немного непонятна мне данная фраза… Если терминал был закрыт, то он ничего писать не может… Если вопрос касается того времени, пока выполняется какой-то процесс в терминале, запущенном в фоновом процессе, то необходимо воспользоваться командой screen. Если терминал запускается скриптом, то могу предложить не запускать терминал, а хапустить просто bash с необходимой командой и в конце команды перенаправить stdout и stderr в нужные файлы.

  3. sisdba
    Февраль 26th, 2013 at 00:02
    7

    gzip -9 -c < pipe > out и cat /path/to/file > pipe
    Помоему < и > неотработали в html коде в > или < , из-за лишнего знака ; Я прав?

  4. sisdba
    Февраль 26th, 2013 at 00:06
    8

    А нет ошибся. Ошибка вот сдесь &lt;

    • Март 9th, 2013 at 18:14
      9

      Да, есть такие ошибки.
      Не могу поймать, когда символы меняются на UTF-коды…

  5. Июнь 7th, 2013 at 20:37
    10

    Процесс 1 открывает файл и порождает потомка 2, после этого пишет в файл N байт и посылает сигнал процессу 2. Процесс 2 пишет N байт в файл, посылает сигнал процессу 1 и завершается. Процесс 1, получив сигнал, считывает данные из файла, выводит их на экран и завершается. Нужна помощь.

    • Июнь 12th, 2013 at 19:36
      11

      В чем заключается помощь, Ирина?

      • Alex
        Ноябрь 21st, 2014 at 03:44
        12

        Наверное, ей нужна была прога, которая это делает.
        Вобщем, стандартная лабораторная работа :)

        P.S. Статья понравилась: получил новые знания + разложил по полочкам то, что знал ранее, спасибо!

  6. Arch
    Сентябрь 12th, 2014 at 22:13
    13

    Очень интересно и познавательно! *THUMBS UP*

    • Декабрь 17th, 2014 at 21:21
      14

      Приходите еще )

  7. Георгий
    Октябрь 14th, 2014 at 17:50
    15

    Подскажите пожалуйста, как сделать DUMP оперативной память в Debian. Исходя из Вашего поста, по моим выводам пишу так:
    # dump 0f /home/user/dump.dmp /proc

    или что то не верно, подскажите чайнику пожалуйста)) насколько мне известно, 140кб оперативной системы, как то маловато …

  8. Аркадий
    Январь 20th, 2015 at 00:41
    17

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

    • Апрель 9th, 2015 at 17:00
      18

      Подсказка: команды ps и wc ))

  9. Костярин
    Февраль 3rd, 2015 at 19:43
    19

    А можно поподробней про разделяемую память? Что-то не пойму, как это реализуется, как процессы находят дуг-друга. Какие системные функции нужно использовать.

    • Июнь 7th, 2015 at 14:57
      20

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

  10. perpetual.student
    Апрель 30th, 2015 at 14:34
    21

    Как убить процесс, который находится в состоянии D
    # ps aux |grep rsync
    root 13572 0.0 0.0 7840 880 pts/1 S+ 14:26 0:00 grep rsync
    root 21324 0.7 1.2 62444 48608 ? D Apr29 12:21 /usr/bin/rsync -auhv --ignore-errors /mnt/tmpDATA/samba/fileexchange/ДляВаси /mnt/diskdata/samba/fileexchange/
    root 21325 0.0 0.0 0 0 ? Z Apr29 0:00 [rsync]

    • Июнь 7th, 2015 at 22:40
      22

      как и любой другой процесс:
      kill PID
      Для Вашего случая так:
      kill 21324

  11. Валерий
    Август 21st, 2015 at 21:31
    23

    И даже спустя пять лет статья приносит людям пользу :-) Спасибо, немного утряс бардак в голове.

  12. Taraskyn
    Май 4th, 2016 at 00:28
    24

    Спасибо за материал! Все по полочкам, все доступно. Очень помогло *THUMBS UP*

Написать комментарий