Работа с процессами в Linux
Команда ps выводит список текущих процессов на вашем сервере. Используется обычно в сочетании с командой grep и more или less.
Примечание: more и less – дополнительные команды, которые помогают фильтровать и разбивать на страницы выходные данные ps, так как они часто бывают довольно длинными.
Как использовать команду ps
Общий синтаксис команды ps выглядит следующим образом:
По историческим причинам и из соображений совместимости команда ps принимает несколько различных типов параметров:
- Опции стиля UNIX, перед которыми стоит одна черточка.
- Варианты стиля BSD, используемые без тире.
- Длинные опции GNU, начинающиеся с двух тире.
Все типы опций могут быть смешанными, но в некоторых особых случаях могут возникать конфликты, поэтому лучше придерживаться одного типа опций. Опции BSD и UNIX могут быть сгруппированы.
В простейшей форме, когда используется без какой-либо опции, ps будет напечатано четыре столбца информации для минимум двух процессов, запущенных в текущей оболочке, самой оболочки и процессов, которые выполняются в оболочке при выполнении команды.
Вывод включает в себя информацию о shell (bash) и процессе, запущенном в этой оболочке (введенная вами команда ps):
PID TTY TIME CMD 1809 pts/0 00:00:00 bash 2043 pts/0 00:00:00 ps
Четыре колонки помечены PID, TTY, TIMEи CMD.
- PID- Идентификатор процесса. В большинстве случаев при запуске psкоманды наиболее важной информацией, которую ищет пользователь, является идентификатор процесса. Знание PID позволяет убить сбойный процесс.
- TTY – Название управляющего терминала для процесса.
- TIME – Совокупное время ЦП процесса, показанное в минутах и секундах.
- CMD – Имя команды, которая использовалась для запуска процесса.
Вывод выше не очень полезен, так как он не содержит много информации. Настоящая сила команды ps появляется при запуске с дополнительными опциями.
Команда ps принимает огромное количество опций, которые можно использовать для отображения определенной группы процессов и различной информации о процессе, но для повседневного использования требуется лишь несколько из них.
Команда ps чаще всего используется со следующей комбинацией параметров:
- Опция a указывает ps вывести на дисплей процессы всех пользователей, за исключением тех процессов, которые не связаны с терминалом и процессами группы лидеров.
- В u – подставки для ориентированных на пользователя формате, который обеспечивает подробную информацию о процессах.
- Опция x в ps перечисляет процессы без управляющего терминала. В основном это процессы, которые запускаются во время загрузки и работают в фоновом режиме.
Команда будет отображать информацию в одиннадцати столбцах USER, PID, %CPU, %MEM, VSZ, RSS, STAT, START, TTY, TIMEи CMD.
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.8 77616 8604 ? Ss 19:47 0:01 /sbin/init root 2 0.0 0.0 0 0 ? S 19:47 0:00 [kthreadd] …
Мы уже объяснили метки PID, TTY, TIMEи CMD. Вот объяснение других меток:
- USER – Пользователь, который запускает процесс.
- %CPU- Процесс использования процессора .
- %MEM – Процент резидентного установленного размера процесса к физической памяти на машине.
- VSZ – Размер виртуальной памяти процесса в KiB.
- RSS- Размер физической памяти , используемой процессом.
- STAT- Код состояния процесса, который может быть Z (zombie), S (sleeping), R (running) .. и т. д.
- START – время, когда команда началась.
Чтобы напечатать дерево процессов, добавьте опцию f. Это укажет ps отобразить древовидное представление дочерних процессов.
Команда ps также позволяет вам сортировать вывод. Например, чтобы отсортировать вывод на основе использования памяти, вы бы использовали:
- Опция e указывает ps отобразить все процессы.
- f – полноформатный список, который содержит подробную информацию о процессах.
Команда будет отображать информацию в столбцах UID, PID, PPID, C, STIME, TIME и CMD.
UID PID PPID C STIME TTY TIME CMD root 1 0 0 19:47 ? 00:00:01 /sbin/init root 2 0 0 19:47 ? 00:00:00 [kthreadd] …
Метки, которые еще не объяснены, имеют следующее значение:
- UID – То же USER, что и пользователь, который запускает процесс.
- PPID – Идентификатор родительского процесса.
- C- То же %CPU, что процесс загрузки процессора.
- STIME- То же START, что и время начала команды.
Чтобы увидеть только процессы, запущенные от имени определенного пользователя, используйте следующую команду, где andreyex указано имя пользователя:
ps -f -U andreyex -u andreyex
Пользовательский формат
Опция o позволяет указать, какие столбцы будут отображаться при выполнении команды ps.
Например, чтобы напечатать информацию только о PID и COMMAND вы бы выполнить одну из следующих команд:
ps -efo pid,commconsole-bash ps auxo pid,comm
## Использование команды ps может использоваться в сочетании с другими командами через трубопровод. Если вы хотите отобразить вывод команды ‘ps’, по одной странице за раз передайте его в команде less:
Выходные данные команды ‘ps’ могут быть отфильтрованы с помощью grep, например, чтобы показать только процесс, принадлежащий пользователю root, вы должны запустить:
console-bash ps -ef | grep root “ `
Выбор конкретных процессов
Вы можете вывести определенные процессы с помощью ps с помощью различных критериев выбора.
Например, если вы знаете идентификатор процесса PID, вы можете просто использовать следующую команду:
Вы можете выбрать несколько процессов, указав несколько идентификаторов процесса следующим образом:
Вы также можете указать их с помощью списка, разделенного запятыми:
Скорее всего, вы не будете знать идентификатор процесса, и его легче искать по команде. Для этого используйте следующую команду:
Другие способы фильтрации результатов – по группам. Вы можете искать по имени группы, используя следующий синтаксис:
Например, чтобы узнать все процессы, выполняемые группой accounts, выполните следующие действия:
ps -G “accounts”
ps –Group “accounts”
Вы также можете выполнять поиск по идентификатору группы GID вместо имени группы с помощью строчной буквы g следующим образом:
Если вы хотите найти все процессы, выполняемые конкретным пользователем, выполните следующую команду, указав имя пользователя:
Обратите внимание, что это показывает человека, чьи учетные данные используются для запуска команды. Например, если вы вошли в систему как gary и запустите указанную выше команду, она покажет всю команду, которую вы выполняете. Если вы входите в систему как tom и используете sudo для запуска команды, то приведенная выше команда покажет команду tоm’а, которую запускает gary, а не tom.
Чтобы ограничить список только процессами, действительно запущенными gary, используйте следующую команду:
Форматирование вывода команды ps
По умолчанию вы получаете четыре столбца, когда используете команду ps: PID, TTY, Time, Command. О них написано в начале статьи.
Вы можете получить полный список, выполнив следующую команду:
Опция -e, показывает все процессы, а -f показывает полную информацию: UID – идентификатор пользователя выполняющего команду, PID – это идентификатор процесса команды, PPID – идентификатор родительского процесса, который отпустил команду, C – количество дочерних процессов, STIME – это время начала процесса, TTY, TIME, CMD.
Вы можете получить еще больше информационных столбцов, используя следующую команду:
Дополнительные столбцы – SZ, RSS и PSR. SZ – это размер процесса, RSS – реальный размер памяти, а PSR – процессор, которому назначена команда.
Вы можете указать пользовательский формат, используя следующий формат:
Как узнать под каким пользователем запущена служба?
есть системд запущенный из-под пользователя и исполняющий сервисы из-под пользователя. это вот как раз systemd –user
минус — запускается только после вхождения пользователя в систему.
есть параметр, позволяющий запускать системные (т.е. запускающиеся вместе с системой, независимо от сессий пользователя) сервисы под конкретным пользователем.
[Service]
User=%user%
Group=%group%
pfg ★★★★★ ( 22.06.22 01:10:14 MSK )
Последнее исправление: pfg 22.06.22 01:14:06 MSK (всего исправлений: 3)
спасибо,
а как проверить уже запущенную службу? под каким юзером она робит
Напиши systemd юнит и укажи в параметре user имя пользователя от имени которого должно запускаться то, что указано в параметре exexstart.
~ ➜ systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2022-06-22 20:01:11 MSK; 40min ago TriggeredBy: ● docker.socket Docs: https://docs.docker.com Main PID: 1152 (dockerd) Tasks: 35 (limit: 37712) Memory: 201.9M CPU: 6.536s CGroup: /system.slice/docker.service ├─1152 /usr/bin/dockerd -H fd:// └─1167 containerd --config /var/run/docker/containerd/containerd.toml --log-level info ~ ➜ ps -u -p 1152 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1152 0.0 0.2 2038084 85624 ? Ssl 20:01 0:00 /usr/bin/dockerd -H fd:// ~ ➜
Как определить от какого пользователя запущена программа?
Доброго дня.
Подскажите пожалуйста как определить от какого имени запущен squid. Проверял командой ps aux | grep squid и вывод следующий:
Скрин
По строкам:
root 22483 0.0 0.0 89984 3588 ? Ss окт18 0:00 /usr/sbin/squid -f /etc/squid/squid.conf
squid 22485 0.0 1.9 165552 76776 ? S окт18 6:04 (squid-1) -f /etc/squid/squid.conf
непонятно от рута или от сквида запущен?
У тебя 2 процесса сквида. Родительский процесс запущен от рута, дочерний процесс работает с правами пользователя.
root запустил первый (точнее PID1 который работает с правами root) который запустил второй от пользователя squid (что задано в конфиге). Вот тебе выхлоп nginx такой же
$ ps aux | grep nginx root 2181 0.0 0.3 159516 1624 ? Ss 08:40 0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; www-data 2182 0.0 0.6 159840 3276 ? S 08:40 0:00 nginx: worker process
mandala ★★★★★ ( 24.10.18 08:54:20 MSK )
Последнее исправление: mandala 24.10.18 08:55:42 MSK (всего исправлений: 1)
Хотел поставить rejik а там поле есть где нужно прописать от какого пользователя запущен сквид. мне в итоге то какого пользователя указать?