Список запущенных демонов Linux

Обновлено: 21.11.2024

В среде Linux демоны запускаются во время загрузки. Поскольку система Linux является идеальным клоном Unix, процесс инициализации считается родительским процессом для демона.

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

Соглашение об именах, определяющее большинство процессов-демонов, — это однобуквенный суффикс d. Это соглашение об именах позволяет различать обычные системные процессы и процессы, управляемые демоном. Например, sshd — это процесс-демон, отвечающий за управление входящими соединениями SSH. Другой пример процесса демона — syslogd. Он отвечает за ведение журнала системы Linux.

В среде Linux демоны запускаются во время загрузки. Поскольку система Linux является идеальным клоном Unix, процесс инициализации считается родительским процессом для демона. Чтобы запускать и останавливать демоны в вашей операционной системе Linux, вам сначала нужно получить доступ к каталогу скриптов /etc/init.d в вашей ОС.

Общие функции демонов

  • Это позволяет вашей системе правильно отвечать на сетевые запросы, связывая каждый запрос с совместимым сетевым портом. Типичным сетевым портом, который обрабатывает демон, является порт 80.
  • Демоны позволяют запускать или выполнять запланированные системные задачи. Демон, ответственный за эту конкретную задачу, называется cron. Это создаст задание cron, которое будет обрабатывать периодическое выполнение ваших запланированных задач.
  • Демоны также вносят бесценный вклад в мониторинг производительности вашей системы. Например, они могут проверить состояние RAID-массива или жесткого диска.

Полезные сервисные демоны Linux

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

Запуск/остановка/перезапуск демонов: подход на основе терминала

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

Замените синтаксический аргумент preferred-daemon-name именем системного демона Linux по вашему выбору. Вы можете выбрать один из демонов из выделенного выше списка, если он активен или уже определен в вашей системе Linux. Например, мы можем реализовать практическое использование приведенного выше синтаксиса, пытаясь запустить, остановить и перезапустить демон. Перейдите в каталог /etc/init.d на вашем терминале, чтобы просмотреть список доступных демонов в вашей системе Linux.

список активных демонов в вашей системе Linux.jpg как запустить, остановить и перезапустить службу демона в вашей системе Linux.jpg

Список демонов ваших систем Linux

Более эффективный способ узнать о доступных демонах в вашей системе Linux вместо перехода к каталогу /etc/init.d — составить список всех определенных активных и неактивных демонов из этого каталога с помощью одной команды. Следующая команда эффективна для достижения этой цели.

список всех демонов в вашей операционной системе Linux.jpg

Заключенные в фигурные скобки положительные знаки [+] и отрицательные [-] перед перечисленными именами демонов подразумевают, что они либо активны, либо неактивны соответственно.

Работа с пользовательскими демонами

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

Достойная реализация демона с использованием Python тщательно продемонстрирована и задокументирована Сандером Маречалом. Стремитесь следовать порядку выполнения при создании этого демона. Во-первых, ваша система Linux нуждается в установке пакетов Python для успешной разработки демонов.Чтобы установить Python, вы можете использовать следующую команду.

Ссылка на код демона Python, созданный Сандером Маречалом, также предлагает улучшенную версию кода Python 3. Было бы полезно, если бы вы решили реализовать его, чтобы лучше понять, как работают демоны.

Если вы не уверены, установлен ли у вас Python, выполните следующую команду на своем терминале Linux.

Назначение любого демона

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

взаимодействие пользователя с демоном

Не рекомендуется, чтобы системный пользователь и созданный демон взаимодействовали напрямую. Если это необходимо для демона, вы создаете для связи с системным пользователем. Это общение может быть облегчено с помощью чего-то вроде интерфейса GUI. Эта коммуникационная платформа может иметь либо сложный графический интерфейс GTK+, либо простой набор сигналов.

Создание демона

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

Вы можете сохранить код демона Python3, созданный Сандером Маречалом, в файле Python и демонизировать его с помощью приведенной выше команды. Хотя приведенная выше команда терминала легко создаст для вас демона, вам придется столкнуться с такими проблемами, как непредсказуемые выходные данные терминала. Эти проблемы зависят от того, насколько хорошо вы провели рефакторинг кода демона Python. Кроме того, описанный выше подход не поддерживает назначение файлов блокировки PID конкретным демонам. Это делает невозможным управление любым демоном, так как большинство из них будут выполняться мгновенно. С другой стороны, если вам нужен только простой демон, вышеупомянутый подход даст вам желаемые результаты демона.

Базовая структура демона

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

Из моего вопроса «Могут ли различаться идентификатор процесса и идентификатор сеанса демона?» стало ясно, что я не могу легко определить характеристики демона. Я читал в разных статьях и на разных форумах, что команда service --status-all может использоваться для вывода списка всех демонов в моей системе. Но я не думаю, что команда перечисляет все демоны, потому что NetworkManager , демон, который в настоящее время работает в моей системе Ubuntu 14.04, не указан командой. Есть ли какая-то команда для вывода списка запущенных демонов или есть способ найти демонов из самой файловой системы?

Вы уверены, что его нет в списке? Как вы проверяете? Я вижу это на моем Debian. Обратите внимание, что это имя network-manager , а не NetworkManager .

Да. Я уверен. Ничего, связанного с термином сеть, не указано. Также в нем указан anacron, который не является демоном в своем сценарии инициализации.

Anacron не является демоном, это скорее вопрос семантики, поскольку он не работает постоянно. Он по-прежнему работает как служба, которую вы обычно называете демонами. Пожалуйста, отредактируйте свой вопрос и i) сообщите нам, какую Ubuntu вы используете, и ii) что именно вы подразумеваете под «демоном». Какова ваша конечная цель здесь?

Я полагаю, что любая служба, работающая в фоновом режиме, является демоном. Я упомянул anacron, потому что в /etc/init.d/anacron было сказано, что это не демон. Моя цель — написать программу на C++ для вывода списка всех демонов, работающих в моей системе. Для этого мне нужно знать, какие файлы анализировать, чтобы получить подробную информацию.

Что ж, если вы определяете демонов как сервисы, вам нужен сервис --status-all. Ubuntu, похоже, по-разному относится к NetworkManager. Я получаю как networking, так и network-manager в выводе services --status-all в Debian, но только networking в Ubuntu. Я думаю, вам нужно определить, что именно вы подразумеваете под «демоном».

3 ответа 3

Понятие демон связано с процессами, а не с файлами. По этой причине нет смысла «находить демонов в файловой системе». Просто чтобы сделать понятие немного яснее: программа представляет собой исполняемый файл (видимый в выводе ls); процесс является экземпляром этой программы (отображается в выводе ps ).

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

Поле вывода tty содержит "?" когда у процесса нет управляющего терминала.

Большая проблема возникает, когда ваша система работает в графическом окружении. Поскольку программы с графическим интерфейсом (например, Chromium) не привязаны к терминалу, они также отображаются в выводе. В стандартной системе, где root не запускает графические программы, вы можете просто ограничить предыдущий список процессами root. Этого можно добиться с помощью переключателя ps ' -U.

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

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

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

Теперь у ps есть переключатель -C, который позволяет нам выбирать по имени команды. Мы только что получили наш список команд, так что давайте внедрим его в командную строку ps. Обратите внимание, что после этого я использую --deselect, чтобы отменить выбор.

Теперь у нас есть список всех процессов, не связанных с графическим интерфейсом. Давайте не будем забывать о нашем правиле «без подключения телетайпа». Для этого я добавлю -o tty,args к предыдущей строке, чтобы вывести tty каждого процесса (и его полную командную строку):

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

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

За это мы можем поблагодарить демонов — они делают эту работу за нас.

Что такое демон в Linux?

демон (обычно произносится как: day-mon , но иногда произносится как to rhyme с diamond ) — это программа с уникальной целью. Это служебные программы, которые тихо работают в фоновом режиме, чтобы контролировать и заботиться об определенных подсистемах, чтобы гарантировать, что операционная система работает правильно. Демон принтера контролирует и заботится о службах печати. Сетевой демон отслеживает и поддерживает сетевые соединения и т. д.

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

Для тех, кто перешел на Linux из мира Windows, демоны известны как службы. Для пользователей Mac термин сервисы используется по-другому. Операционная система Mac на самом деле UNIX, поэтому в ней используются демоны. Термин услуги используется, но только для обозначения программного обеспечения, находящегося в меню "Службы".

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

Какие демоны работают на вашем компьютере?

Чтобы идентифицировать демона, найдите процесс, оканчивающийся на букву d. Это общее правило Linux, что имена демонов заканчиваются таким образом.

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

Команда pstree — это небольшая удобная утилита, которая показывает процессы, запущенные в настоящее время в вашей системе, и отображает их в виде древовидной диаграммы. Откройте терминал и введите эту команду:

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

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

Создание демонов

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

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

В Linux существует три типа процессов: интерактивные, пакетные и демон.

Интерактивные процессы — это те, которые запускаются пользователем в командной строке и называются интерактивными процессами.

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

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

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

Я не буду вдаваться в подробности процесса разветвления, но надеюсь, что смогу быть достаточно кратким, чтобы показать небольшую справочную информацию, чтобы описать, что делается. Хотя существуют и другие методы создания процессов, традиционно в Linux способ создания процесса заключается в создании копии существующего процесса для создания дочернего процесса. Затем выполняется системный вызов exec для запуска другой программы.

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

Процесс, который создает демоны, — это процесс инициализации (называемый init ), который разветвляет свой собственный процесс для создания новых. Таким образом, процесс инициализации является прямым родительским процессом.

Есть еще один способ порождения демона: другой процесс создает дочерний процесс, а затем умирает (термин, часто используемый вместо выход). Когда родитель умирает, дочерний процесс становится сиротой. Когда дочерний процесс становится потерянным, он принимается процессом инициализации.

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

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

Примеры демонов Linux

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

systemd — основной целью этого демона является унификация конфигурации и поведения служб во всех дистрибутивах Linux.

rsyslogd — используется для регистрации системных сообщений. Это более новая версия syslogd с несколькими дополнительными функциями. Он поддерживает ведение журналов как в локальных, так и в удаленных системах.

udisksd — обрабатывает такие операции, как запрос, монтирование, размонтирование, форматирование или отсоединение устройств хранения, таких как жесткие диски или флэш-накопители USB.

logind — крошечный демон, который различными способами управляет входом пользователей в систему и рабочими местами

sshd — демон, отвечающий за управление службой SSH. Это используется практически на любом сервере, который принимает SSH-соединения.

ftpd — управляет службой FTP. FTP или протокол передачи файлов — широко используемый протокол для передачи файлов между компьютерами; один действует как клиент, другой действует как сервер.

crond — демон-планировщик для действий, зависящих от времени, таких как обновления программного обеспечения или проверки системы.

Какое происхождение слова демон?

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

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

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

Чтобы внести свой вклад в обсуждение, вот мое мнение по этому поводу.

Самая ранняя форма слова «демон» записывалась как даймон, форма ангела-хранителя — духа-помощника, который помогал формировать характер людей, которым они помогали. Сократ утверждал, что у него есть тот, который служил ему ограниченным образом, но правильно. Даймон Сократа только говорил ему, когда держать рот на замке. Сократ описал своего даймона во время судебного процесса в 399 г. до н.э., поэтому вера в даймонов существует уже довольно давно. Иногда даймон пишется как daemon. Daimon и daemon здесь означают одно и то же.

В то время как демон — это слуга, демон — это злой персонаж из Библии. Различия в написании являются преднамеренными и, по-видимому, были приняты в 16 веке. Демоны — хорошие парни, а демоны — плохие.

Слово "демон" в вычислительной технике появилось в 1963 году. Проект MAC — это сокращение от Проект по математике и вычислениям. Он был создан в Массачусетском технологическом институте. Именно здесь слово «демон» вошло в обиход для обозначения любого системного процесса, который отслеживает другие задачи и выполняет заранее определенные действия в зависимости от их поведения. Слово «демон» было названо в честь демона Максвелла.

Демон Максвелла — результат мысленного эксперимента. В 1871 году Джеймс Клерк Максвелл представил разумное и находчивое существо, способное наблюдать и направлять движение отдельных молекул в определенном направлении. Цель мыслительного упражнения состояла в том, чтобы показать возможность противоречия второму закону термодинамики.

Я видел некоторые комментарии о том, что слово "демон" является аббревиатурой от Disk And Executive MONitor. Первоначальные пользователи слова «демон» никогда не использовали его для этой цели, поэтому идея аббревиатуры, я считаю, неверна.

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

Имя демона — Beastie. Я еще не исследовал это полностью (пока), но я нашел один комментарий, в котором говорится, что Beastie происходит от неразборчивости букв, BSD. Попытайся; Я сделал. Произносите буквы как можно быстрее, и вы получите звук, очень похожий на beastie.

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

Системы Linux предоставляют различные системные службы (такие как управление процессами, вход в систему, системный журнал, cron и т. д.) и сетевые службы (такие как удаленный вход в систему, электронная почта, принтеры, веб-хостинг, хранение данных, передача файлов). , разрешение доменных имен (с использованием DNS), динамическое назначение IP-адресов (с использованием DHCP) и многое другое.

Технически служба – это процесс или группа процессов (известных как демоны), постоянно работающих в фоновом режиме и ожидающих поступления запросов (особенно от клиентов).

Linux поддерживает различные способы управления службами (запуск, остановка, перезапуск, включение автоматического запуска при загрузке системы и т. д.), обычно с помощью диспетчера процессов или служб. Большинство, если не все современные дистрибутивы Linux теперь используют один и тот же диспетчер процессов: systemd.

Systemd — это системный и сервисный менеджер для Linux; вставная замена процесса инициализации, совместимая со сценариями инициализации SysV и LSB, а команда systemctl является основным инструментом для управления systemd.

В этом руководстве мы покажем, как составить список всех запущенных служб в systemd в Linux.

Список запущенных служб в SystemD в Linux

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

Чтобы вывести список всех загруженных служб в вашей системе (независимо от того, активны ли они, запущены, завершены или отказали), используйте подкоманду list-units и переключатель --type со значением службы.

Чтобы вывести список всех загруженных, но активных служб, как запущенных, так и завершенных, можно добавить параметр --state со значением active следующим образом.

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

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

Затем добавьте следующую строку под список псевдонимов, как показано на скриншоте.

Сохраните изменения в файле и закройте его. И с этого момента используйте команду «running_services», чтобы просмотреть список всех загруженных, активно работающих служб на вашем сервере.

Кроме того, важным аспектом сервисов является используемый ими порт. Чтобы определить порт, который прослушивает процесс-демон, вы можете использовать инструменты netstat или ss, как показано ниже.

Где флаг -l означает вывод всех прослушиваемых сокетов, -t отображает все подключения TCP, -u показывает все подключения UDP, -n означает вывод числовых номеров портов (вместо имен приложений), а -p означает отображение имени приложения.< /p>

В пятом столбце показан сокет: Локальный адрес:Порт. В данном случае процесс zabbix_agentd прослушивает порт 10050.

Кроме того, если на вашем сервере запущена служба брандмауэра, которая контролирует, как блокировать или разрешать входящий или исходящий трафик выбранных служб или портов, вы можете перечислить службы или порты, которые были открыты в брандмауэре, с помощью firewall-cmd или ufw (в зависимости от используемого дистрибутива Linux), как показано ниже.

На этом пока все! В этом руководстве мы продемонстрировали, как просматривать запущенные службы в systemd в Linux. Мы также рассмотрели, как проверить порт, который прослушивает служба, и как просмотреть службы или порты, открытые в системном брандмауэре. У вас есть дополнения или вопросы? Если да, свяжитесь с нами, используя форму комментариев ниже.

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

Если вы цените то, что мы делаем здесь, в TecMint, вам следует подумать о следующем:

TecMint – это самый быстрорастущий и пользующийся наибольшим доверием сайт сообщества, где можно найти любые статьи, руководства и книги по Linux в Интернете. Миллионы людей посещают TecMint! для поиска или просмотра тысяч опубликованных статей, доступных всем БЕСПЛАТНО.

Если вам нравится то, что вы читаете, купите нам кофе (или 2) в знак признательности.

Читайте также: