- hharek
- Оглавление
- Процесс в Linux
- Закрытие процесса
- Программы Linux для работы с процессами
- Непрерывный процесс
- Отвязываемся от консоли
- Одна программа — один процесс
- PHP-программа как Unix скрипт
- Работа с процессами в Linux
- Список процессов
- Список процессов Linux
- Список процессов в Linux
- 1. Утилита ps
- 2. Утилита top
- 3. Утилита htop
- 4. Программа Gnome Monitor
- 5. Утилита atop
- Выводы
hharek
В программирование бывает необходимость писать программы, которые должны работать непрерывно, причины тому могут быть: непрерывное отслеживание изменений на сайте, длительное выполнение какой-либо операции, веб-сокет сервер и другие. И для небольших программ язык PHP, как никогда подходит лучше всего. Здесь я попытаюсь описать возможные шаги, которые нужно предпринять чтобы написать свою программу работающую в среде Linux. Я предполагаю что Вы уже знакомы с Линукс и слова «консоль» и «ssh» Вас уже не пугают. Примеры команд будут запущены в среде Debian Linux 8.4, с PHP 7. Сам PHP 7 установлен как CLI.
Оглавление
Процесс в Linux
Запуская программу в Unix вы создаёте «процесс», т.е. процессор начинает выполнять инструкции программы. Чтобы не запутаться в названиях «программа» и «процесс» можно представить, что «программа» это некоторая бумага с текстом приказа, а «процесс» это робот который читает приказ и выполняет его. Вполне может быть что процесс может удалить программу, которая его запустила или что процесс запустил другие программы, т.е. вызвал другие процессы.
Запуская программу в Unix процессу присваиваются некоторые параметры, а именно:
— PID — уникальный номер процесса. С помощью PID можно отправить сигнал процессу, узнать о его состоянии. PID всегда уникален и предсказать этот номер не представляется возможным. Если выполнить в консоле команду то увидим ID процесса.
* Запуская программу в консоли я использую на конце символ «&», это я делаю для того чтобы после запуска в консоли можно было запускать другие программы, т.е. не быть заблокированным своим процессом.
— Имя — имя процесса формируется из имени программы и параметры его запуска. Т.е. если выполнить в консоли « php sleep.php & » процесс будет называться « php sleep.php » если же выполнить « /usr/local/bin/php sleep.php & », то процесс будет называться « /usr/local/bin/php sleep.php ». Но так бывает не всегда, при желании процесс может задать себе новое какое пожелает. Пример:
Вывод команды ps будет напоминать что-то вроде этого.
Я всё же рекомендую не использовать в имени процесса UTF-8 символы и спец символы, во избежания проблем с операционными системами Unix, без поддержки Unicode на уровне ядра.
— PPID — PID родительского процесса. У каждого процесса есть родитель, т.е. процесс который его запустил. У родительского процесса также может присутстовать родитель и так вверх по иерархии. На самом верху иерархии находится процесс « init » или « systemd », он является родоначальников всех процессов и его запускает само ядро Linux. У процесса всегда есть родитель, если родительский процесс закрывается все потомки родительского процесса «усыновляются» процессом « init » или « systemd ». Если вы запускаете программу через консоль, то родителем процесса будет консольная программа, вероятно « tcsh », « bash » или « zsh ». Посмотреть иерархию процессов можно так:
— UID — UID пользователя, который запустил процесс. После запуска процессу ещё присваивается владелец и группа (почти как у файла) и с правами этого пользователя процесс будет работать. К примеру если мы запустим программу от пользователя «user1» находящегося в группе «group1», то процесс сможет выполнять действия доступные пользователю «user1», и не сможет скажем зайти в папку «/root» или удалить файл, владелец которого является пользователь «user2».
— Аргументы программы — строки указанные в консоле при запуске программы после имени программы через пробел. Например если в консоли запустить программу: «php example.php a b -p1 —test=2», аргументами будут строки «a», «b», «-p1», «—test=2». В PHP аргументы программы можно найти в глобальном массиве $argv, а кол-во аргументов можно найти в глобальной переменной «$argc». Пример:
Закрытие процесса
В большинстве случаев процесс сам знает когда ему закончить работу, т.е. выполнил программу и завершился, но бывают случаи, когда процесс необходимо завершить принудительно. Для того чтобы обратиться к процесс нужно знать его PID или хотя бы имя процесса, чтобы по нему потом определить PID. После того как узнали PID процесса можно отправить сигнал закрытия, это делается командой « kill ». Пример:
Бывает такое что процесс не может завершиться, то тогда ему нужно отправить сигнал «принудительное закрытие», это делается командой « kill -9 PID ». Ещё процесс можно завершить по имени процесса, для этого используйте команду « killall ».
Если вы запустили программу и программа заблокировала консоль используйте сочетание клавиш « Ctrl + C » и программа завершится. Или если просто хотите вернуться консоль не закрывая программу, то нажмите « Ctrl + Z », а далее « bg ».
Программы Linux для работы с процессами
Программ для работы с процессами множество, я же расскажу о программах которые мне нравятся больше и популярные примеры их использования. Речь пойдёт о программах: ps , pgrep , kill , htop .
— ps — показывает запущенные процессы и сведения по ним. Примеры:
* — Если написать просто «ps -ef | grep «simple.php»», то отобразиться не только нужный нам процесс и сведения о самом нашем процессе «ps» и это может запутать.
— pgrep — ищет процесс по имени и возвращает PID процесса. В отличии от ps не возвращает PID самого себя, а только нужный нам. В большинстве случаев результат программы pgrep используется другими программами. Примеры:
— kill — отправить сигнал процессу. Не стоит пугаться названия этой программы, она не только завершает процесс, но и может отправить разные сигналы процессу. В основном используется чтобы принудительно закрыть процесс.
* Если процесс не настроен на «ловлю» этого сигнала процесс завершиться.
— htop — программа для мониторинга процессов в реальном времени. Программа позволяет узнать загруженность системы, а также узнать какие процессы используют большую часть процессорного времени или оперативной памяти. Удобно запускать в отдельном окне и заглядывать туда.
— pstree — показать дерево процессов. Можно посмотреть всю иерархию процессов или всех «предков» процесса.
Непрерывный процесс
Теперь нам нужно добиться того чтобы наш скрипт работал постоянно (а не выключался после запуска), для этого нам достаточно написать бесконечный цикл, к примеру вот так:
Если мы запустим этот скрипт, у нас действительно процесс будет запущен постоянно, но при этом мы получим почти 100% загрузку процессора, т.е. итерации цикла будут выполняться постоянно со 100% скоростью. Чтобы этого избежать нагрузку процессора, но при этом получать отклик необходимо по окончании каждой итерации цикла останавливать скрипт на некоторое количество времени. Для этого можно использовать функции « sleep » или « usleep », при « sleep » указывается время в секундах, а при «usleep» время в микросекундах, т.е. « sleep(2) = usleep(2000000) ». Переделаем наш скрипт:
Здесь «usleep» будет означать, время отклика ваше программы на внешние раздражители (сигналы, сокеты и прочее).Теперь вместо почти 100% загруженности получим почти 0% загруженность процессора при простаивании процесса. Вероятно программа, которая работает в фоне будет не просто выполняться в бесконечном цикле, а ждать поступления определённого события (сигналы, таймер, поступление данных на канал или сокет, изменения в файлах и прочее), здесь же скрипт предоставлен в качестве примера.
Отвязываемся от консоли
Мы научились запускать процессы в режиме ожидания, теперь необходимо чтобы процесс смог самостоятельно работать и не быть «привязанным к консоли». Запуская свои программы в консоли мы можем заметить пока программа выполняется, другие программы запускать в консоли не получается. Есть несколько способов запустить программу в фоновом режиме.
Используйте символ « & » (Амперса́нд) после набора команды. Пример:
Консоли бывают разные (bash, tcsh, zsh и др.) и некоторые консоли (но не tcsh) при закрытии отправляют процессам специальный сигнал «SIGHUP», после чего программы завершают своё выполнение. Чтобы этого избежать используйте программу «nohup», она гарантирует что после закрытия консоли программы не закроются.
После запуска программы нажмите сочетание клавиш « Ctrl + Z » и далее команду « bg ». Сочетаниями клавиш мы ставим процесс на «паузу» и командой « bg » «будим» процесс и он продолжает работать работать в фоне.
Ещё один способ подразумевает что запущенный процесс (родительский процесс) «склонирует» себе подобный процесс (дочерний процесс) т.е. «форкнется» и завершиться. Родительский процесс завершиться, а дочерний процесс продолжит работу, к тому же он усыновляется процессом « init » и перестаёт быть зависимым от консоли. Я считаю этот способ более предпочтительным, т.к. нам теперь нет необходимости на конце писать символ « & » и следить не закроется ли он после закрытия консоли.
Одна программа — один процесс
Запуская нашу программу несколько раз мы будем постоянно «плодить» одинаковые процессы, нам же нужно чтобы программа порождала только один процесс. Чтобы программа запускалась только один раз, нужно чтобы она перед запуском опрашивала систему на поиск себе подобных процессов. Один из способов узнать запущенна ли уже программа это использовать «pid-файл», т.е. файл в котором записан PID запущенного процесса. Определить какой PID текущего процесса можно функцией posix_getpid . Создаётся pid-файл вот так:
Далее при каждом запуске программы, программа будет читать этот файл и на указанный PID будет отправлять сигнал, если ответ придёт утвердительный значит программа уже запущена и запуск повторный не потребуется, если же ответа нет значит можно запускаться. Проверить запущен ли процесс с определённым PID можно функцией « posix_kill », которая отправит сигнал процессу. В функции указать сигнал с номером « 0 ».
Теперь напишем программу, которая будет запускаться только один раз:
Программа запустилась только один раз.
PHP-программа как Unix скрипт
Чтобы запускать php-программу, как обычный Unix-скрипт (т.е. вместо « php script.php » писать « ./script.php »), необходимо в начале файла (перед « ») программы написать путь к интерпритатору, который будет обрабатывать этот файл (в нашем случае это php ). Путь к интерпритатору будет начинаться с символов « #! ». Также нужно задать файлу права на выполнение к примеру 755 , что будет означать — разрешено запускать скрипт всем.
Теперь если запустить файл без указания интерпритатора, то программа запуститься через «/usr/bin/php», если запустить с указанием интерпритатора, то программа запустить через указнный в консоли интерпритатор. Пример:
Если же ваш скрипт будет использоваться в системах, где php может находиться в разных местах используйте такой путь к интерпритатору « #!/usr/bin/env php »
Источник
Работа с процессами в Linux
Список процессов
Вывести на экран список текущих процессов, запущенных пользователем, можно командой:
Чтобы посмотреть список всех процессов с дополнительной информацией, вводим:
Мы увидим, примерно, следующее:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 661 0.0 0.0 4072 8 tty1 Ss+ Jul03 0:00 /sbin/mingetty
root 662 0.0 0.0 4072 8 tty2 Ss+ Jul03 0:00 /sbin/mingetty
root 16355 0.0 0.0 171636 3308 pts/0 S 15:46 0:00 sudo su
root 16366 0.0 0.0 140896 1556 pts/0 S 15:46 0:00 su
root 16368 0.0 0.0 108316 1944 pts/0 S 15:46 0:00 bash
root 18830 0.0 0.0 110244 1172 pts/0 R+ 16:20 0:00 ps u
- USER — учетная запись пользователя, от которой запущен процесс.
- PID — идентификатор процесса.
- %CPU — потребление процессорного времени в процентном эквиваленте.
- %MEM — использование памяти в процентах.
- VSZ — Virtual Set Size. Виртуальный размер процесса (в килобайтах).
- RSS — Resident Set Size. Размер резидентного набора (количество 1K-страниц в памяти).
- TTY — терминал, из под которого был запущен процесс.
- STAT — текущее состояние процесса. Могут принимать значения:
- R — выполнимый процесс;
- S — спящий;
- D — в состоянии подкачки на диске;
- T — остановлен;
- Z — зомби.
- W — не имеет резидентных страниц;
- Дмитрий Моск — IT-специалист.
Настройка серверов, компьютерная помощь.
Как управлять процессами в операционной системе Linux
Источник
Список процессов Linux
На сайте уже есть несколько статей про процессы Linux, в которых подробно описано как ими управлять или как завершить один или группу процессов, но это еще не все. Чтобы правильно управлять процессами и ориентироваться в них вам нужно научиться анализировать список процессов Linux, понимать что значит каждый пункт и зачем он нужен.
В этой статье мы подробно рассмотрим как посмотреть список процессов различными способами, разберем какими бывают процессы, почему так происходит и что с этим делать.
Список процессов в Linux
Я не буду подробно рассказывать про каждую команду, которую можно применять для просмотра списка запущенных процессов, вместо этого мы пройдёмся по основным утилитам для решения этой задачи, рассмотрим как посмотреть список потоков процесса, вывести процессы, которые выполняются на определённом ядре, а также как найти скрытые процессы. Но сначала надо разобраться с терминами.
- Процесс — если говорить простыми словами, это программа и её данные, загруженные в память компьютера;
- Дочерний процесс — процессы могут запускать другие процессы для выполнения параллельных задач или других целей такие процессы называются дочерними. Для них выделяется отдельная область в памяти;
- Поток — поток отличается от процесса тем, что использует ту же память, данные и дескрипторы файлов, что и процесс, в котором он был создан.
1. Утилита ps
Самый простой способ посмотреть список процессов, запущенных в текущей командой оболочке, использовать команду ps без параметров:
Но вряд-ли вас интересует именно это. Чтобы посмотреть все процессы, добавьте опцию -e, а для максимально подробной информации — опцию -F:
Вот значение основных колонок в выводе утилиты:
- UID — имя пользователя, от имени которого работает процесс;
- PID — идентификатор пользователя;
- PPID — идентификатор родительского процесса пользователя;
- C — расходование ресурсов процессора, в процентах;
- SZ — размер процесса;
- RSS — реальный размер процесса в памяти;
- PSR — ядро процессора, на котором выполняется процесс;
- STIME — время, когда процесс был запущен;
- TTY — если процесс привязан к терминалу, то здесь будет выведен его номер;
- TIME — общее время выполнения процесса (user + system);
- CMD — команда, которой был запущен процесс, если программа не может прочитать аргументы процесса, он будет выведен в квадратных скобках;
Чтобы посмотреть список процессов в виде дерева, и понимать какой процесс имеет какие дочерние процессы, выполните команду:
Для просмотра списка процессов с потоками используйте опцию -L:
Здесь появятся ещё две дополнительных колонки:
- LWP — Это сокращение от LightWeight Proccess. Идентификатор потока;
- NLWP — количество потоков у этого процесса.
Чтобы посмотреть список процессов определенного пользователя, например, sergiy используйте опцию -u:
Теперь давайте перейдём к другим, более интересным, интерактивным утилитам.
2. Утилита top
Утилита top не поставляется вместе с системой, поэтому вам придется её установить. Для этого в Ubuntu выполните:
sudo apt install top
Программа позволяет интерактивно просматривать список запущенных процессов Linux. Чтобы вывести список процессов Linux выполните команду:
Колонки, которые выводит программа очень похожи на ps:
- PID — идентификатор процесса;
- USER — имя пользователя, от имени которого выполняется процесс;
- PR — приоритет планировщика, установленный для процесса;
- NI — рекомендуемый приоритет процесса. Это значение можно менять, может не совпадать с реальным приоритетом планировщика;
- VIRT — всё, что находится в памяти, используется или зарезервировано для использования;
- RES — всё, что находится в оперативной памяти и относится к процессу. Расшифровывается как Resident Memory Size, указывается в килобайтах;
- SHR — часть памяти из RES, которую занимают ресурсы, доступные для использования другим процессам. Расшифровывается — Shared Memory Size.
- S — состояние процесса: D — ожидает завершения операции, R — запущен, S — спит, T — остановлен, t — остановлен отладчиком, Z — зомби;
- %CPU — процент использования ресурсов процессора;
- %MEM — процент использования ресурсов оперативной памяти на основе колонки RES;
- TIME — обще процессорное время, которое процесс использовал с момента запуска;
- COMAND — команда, с помощью которой был запущен процесс.
Для того чтобы сделать вывод программы цветным, нажмите Z:
Чтобы вывести дерево процессов Linux нажмите сочетание клавиш Shift+V:
Для отображения потоков нажмите Shift + H:
Если вам недостаточно стандартных полей с информацией о процессах, вы можете нажать Shift + F и выбрать дополнительные поля, которые надо отображать. Для выбора или удаления поля используйте пробел:
3. Утилита htop
Это ещё более мощная утилита для просмотра запущенных процессов в Linux. Пользоваться ею намного удобнее. Здесь поддерживаются не только горячие клавиши, но и управление мышью. А ещё она выводит всё в цвете, поэтому смотреть на данные намного приятнее. Для установки программы выполните:
sudo apt install htop
Для того чтобы запустить выполните в терминале:
Колонки, которые вы увидите в выводе программы, аналогичны тем, что доступны в top, поэтому я не буду рассматривать их здесь отдельно. Для настройки выводимых данных нажмите кнопку F2, затем перейдите в раздел Display Options:
Здесь надо отметить Tree view для вывода списка процессов в виде дерева, а также снять отметки с пунктов Hide threads. для отображения потоков. Здесь есть как потоки пространства пользователя userland process threads, так и потоки пространства ядра — kernel threads. Теперь всё это будет отображаться:
Для того чтобы настроить какие колонки будут отображаться используйте пункт меню Columns:
Тут вы можете выбрать какие колонки отображать, а какие нет, а также можете настроить их порядок.
4. Программа Gnome Monitor
Вы можете смотреть запущенные процессы не только в терминале, но и в графическом интерфейсе. Для этого можно использовать утилиту Gnome Monitor. У неё намного меньше возможностей, по сравнению даже с ps, но зато у неё есть графический интерфейс. Вы можете запустить программу из главного меню системы:
По умолчанию утилита отображает только процессы текущего пользователя. Если вы хотите получить все процессы кликните по иконке бутерброда и выберите Все процессы:
Теперь программа отображает все запущенные процессы Linux в системе. Здесь вы можете выполнять поиск по процессам, завершать их и многое другое. Но потоков и дерева процессов программа не показывает.
5. Утилита atop
Эта программа тоже позволяет посмотреть процессы в Linux , но немного в другом ключе. Утилиту больше интересует сколько тот или иной процесс потребляет ресурсов системы. Утилита даже может показывать потребление процессами пропускной способности диска и сети, но для этого ей необходим специальный патч ядра. Для установки программы в Ubuntu выполните:
sudo apt install atop
Затем запустите её:
Вот основные колонки, которые выводит утилита и их значения:
- PID — идентификатор процесса;
- CID — идентификатор контейнера, используется для контейнеров Docker;
- SYSCPU — время, потраченное процессом на выполнение в пространстве ядра;
- USRCPU — время, потраченное процессом на выполнение в пространстве пользователя;
- VGROW — увеличение использования памяти колонки VIRT за последний период;
- RGROW — увеличение использования памяти колонки RSS за последний период;
- ST — статус процесса, N — новый, E — завершенный, S и С — процесс завершен принудительно с помощью сигнала;
- EXC — код выхода или код сигнала, которым был завершен процесс;
- THR — общее количество потоков в этом процессе;
- S — состояние процесса, аналогично описанному для top;
- CPUNR — номер ядра процессора, на котором запущен основной поток процесса;
- CPU — процент использования ресурсов процессора;
- CMD — команда, которой была запущена программа;
- MEM — процент использования памяти;
Для того чтобы включить отображение потоков процесса нажмите y:
Для просмотра информации о памяти нажмите m, если хотите вернутся обратно, нажмите g:
Выводы
В этой статье мы разобрали самые основные способы посмотреть список процессов в Linux, как видите есть простые способы, но есть и более сложные и информативные. Какими способами вы пользуетесь чаще всего? Напишите в комментариях!
Источник