Linux sid как узнать

Обновлено: 04.07.2024

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

Как узнать pid процесса Linux

Самый распространённый способ узнать PID Linux - использовать утилиту ps:

ps aux | grep имя_процесса

Кроме нужного нам процесса, утилита также выведет PID для grep, ведь процесс был запущен во время поиска. Чтобы его убрать, добавляем такой фильтр:

ps aux | grep имя_процесса | grep -v grep

Например, узнаём PID всех процессов, имя которых содержит слово "Apache":

ps aux | grep apache | grep -v grep

2. pgrep

Если вам не нужно видеть подробную информацию о процессе, а достаточно только PID, то можно использовать утилиту pgrep:

По умолчанию утилита ищет по командной строке запуска процесса, если нужно искать только по имени процесса, то надо указать опцию -f:

3. pidof

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

С помощью опции -s можно попросить утилиту выводить только один PID:

pidof -s apache2

4. pstree

Утилита pstree позволяет посмотреть список дочерних процессов для определённого процесса, также их pid-идентификаторы. Например, посмотрим дерево процессов Apache:

pstree -p | grep apache2

Как узнать PID скрипта

Когда вы запускаете скрипт в оболочке, например Bash запускается процесс известный как подоболочка и выполняет последовательно все команды скрипта. Чтобы узнать PID процесса подоболочки Bash, запущенной для скрипта, обратитесь к специальной переменной $$. Эта переменная доступна только для чтения, поэтому вы не сможете ее редактировать:

Каким процессом занят файл Linux

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

С помощью утилиты lsof можно посмотреть, какие процессы используют директорию или файл в данный момент. Например, откроем аудио-файл в плеере totem, а затем посмотрим, какой процесс использует её файл:

В начале строки мы видим название программы, а дальше идёт её PID. Есть ещё одна утилита, которая позволяет выполнить подобную задачу - это fuser:

Здесь будет выведен только файл и PID процесса. После PID идёт одна буква, которая указывает, что делает этот процесс с файлом или папкой:

  • c - текущая директория;
  • r - корневая директория;
  • f - файл открыт для чтения или записи;
  • e - файл выполняется как программа;
  • m - файл подключен в качестве библиотеки.

Кто использовал файл в Linux

Узнать процесс, который сейчас занимает файл, достаточно просто. Но как узнать, какой процесс обращается к файлу не надолго, например, выполняет его как программу или читает оттуда данные? Эта задача уже труднее, но вполне решаема с помощью подсистемы ядра auditd. В CentOS набор программ для работы с этой подсистемой поставляется по умолчанию, в Ubuntu же его придётся установить командой:

sudo apt install auditd

Теперь создаём правило для мониторинга. Например, отследим, кто запускает утилиту who:

auditctl -w /usr/bin/who -p x -k who_exec

Здесь -w - адрес файла, который мы будем отслеживать, -p - действие, которое нужно отслеживать, -k - произвольное имя для правила. В качестве действия могут использоваться такие варианты:

Теперь выполним один раз who и посмотрим, что происходит в логе с помощью команды ausearch:

sudo ausearch -i -k who_exec

Здесь в секции SYSCALL есть PID процесса, под которым была запущена программа, а также PPID - программа, которая запустила нашу who. Копируем этот PID и смотрим информацию о нём с помощью ps:

ps aux | grep 15595

Становиться понятно, что это bash.

Какой процесс использует порт в Linux

Иногда необходимо узнать PID Linux-программы, которая использует сетевой порт, например 80. Для этого можно использовать утилиту ss:

sudo ss -lptn 'sport = :80'

Мы видим, что это несколько процессов Apache. Использовав опцию dport, можно узнать, какой процесс отправляет данные на указанный порт:

sudo ss -lptn 'dport = :80'

Выводы

В этой статье мы рассмотрели, как узнать PID процесса в Linux по различным условиям: имени или файлу. Как видите, всё достаточно просто, и в считанные минуты можно можно понять, что происходит с вашей операционной системой, и какой процесс за это отвечает.

Нет похожих записей


Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

Что такое ID сеанса

Когда пользователь входит на компьютер с включенными службами удаленных рабочих столов, для него запускается сеанс. Каждый сеанс идентифицируется уникальным идентификатором сеанса. Каждый такой сеанс ассоциируется с интерактивной оконной станцией (interactive window station) "WinSta0"; поэтому каждый сеанс связан со своей собственной оконной станцией "WinSta0". Для каждой оконной станции имеется три стандартных рабочих стола: рабочий стол Winlogon, рабочий стол с заставкой и интерактивный рабочий стол.

Когда пользователь выходит с сервера удаленных рабочих столов (RDC), то сеанс, который клиент имеет на сервере узла сеансов удаленных рабочих столов (ранее назывался сервер терминалов), удаляется. Однако если сеанс консоли служб удаленных рабочих столов не смог завершится, то оконные станции, связанные с сеансом консоли, не удаляются, все процессы продолжают висеть. Это влияет на поведение приложений в среде служб удаленных рабочих столов, когда они настроены для работы в контексте безопасности интерактивного пользователя, также известного как режим активации объекта «RunAs Interactive User». Вот тогда, то и выявляется ID сеанса, чтобы его грохнуть.

Методы определения ID сеанса пользователя RDP

Существует несколько методов, которые могут вам помочь определить номер сеанса и его ID на терминальных серверах и RDS фермах.

  • Утилита quser
  • Утилита qwinsta
  • Утилита Query session
  • Оснастка диспетчер задач
  • PowerShell командлет Get-TerminalSession
  • PowerShell командлет Get-TSSession

Определение ID сеанса через quser

И так у меня есть RDS ферма состоящая из хостов с Windows Server 2012 R2, в базе Active Directory есть пользователь Барбоскин Геннадий Викторович. Данный пользователь вошел на терминал, работал, но по какой-то причине он завис и чтобы корректно разлогинить его сессию нам необходимо вычислить ее номер сеанса и уникальный идентификатор. Попробуем это выполнить через утилиту quser.

QUSER - это утилита командной строки Windows, которая отображает информацию, о пользовательских сессиях на серверах и обычных компьютерах, удобна в случае удаленных рабочих столов. Может получать информацию локально и удаленно.

Вы можете использовать эту команду, чтобы выяснить, вошел ли конкретный пользователь на конкретный сервер Session Host. Команда возвращает:

  • Имя пользователя
  • Имя сеанса на сервере Session Host
  • ID сеанса
  • Состояние сеанса (активно или отключено)
  • Время простоя (количество минут с момента последнего нажатия клавиш или движения мыши во время сеанса)
  • Дата и время входа пользователя

Откройте командную строку cmd, лучше в режиме администратора и введите команду:

утилита quser

У вас будет выведен список всех текущих сессий на вашем терминальном сервере.Если пользователей много, то сложно сразу найти нужного, так как все идет не по алфавиту. Ранее я вам показывал, как фильтровать вывод результатов в командной строке Windows, там была команда findstr. Вводим команду:

фильтрация данных в quser

Как определить ID сеанса пользователя RDP-03

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

Так же есть возможность запустить для конкретного сервера, для этого есть ключ /server

получение ID сеанса через quser

Определение ID сеанса через qwinsta

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

Для того, чтобы получить номер сеанса с ID, введите в командной строке:

qwinsta

Утилита выведет список всех авторизованных в системе пользователей, из полезной информации вы получите:

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

qwinsta barboskin.g или qwinsta " findstr barboskin.g или с ключом /server. qwinsta barboskin.g /server localhost

получение id сеанса через qwinsta

Как узнать id пользователя через диспетчер задач

Покажу и графический метод. который позволяет вам получать ID и номер сеанса на терминальных столах. Откройте диспетчер задач и перейдите на вкладку "Пользователи". У вас будет отображен список сотрудников. Тут для удобства их можно выстроить по алфавиту. Все хорошо, но нет ID и номера сеанса.

как узнать ID сеанса из диспетчера задач

Чтобы включить отображение нужных нам столбцов, вам необходимо щелкнуть правым кликом на область с именем столбцов. В контекстном меню поставьте галки на "Код" и "Сеанс".

Как определить ID сеанса пользователя RDP-08

Как определить ID сеанса пользователя RDP-09

Как узнать id пользователя через query session

QUERY SESSION - это утилита командной строки так же выводящая информацию, о вошедших в систему пользователей. Вводите в командной строке query session, вывод утилиты копия qwinsta. Вы так же будите видеть номер сеанса, логин учетной записи, ID, статус подключения.

query session

Получение информации о сеансе через Get-TerminalSession

PowerShell не зря называют могучим, он поистине может все. К сожалению родных командлетов, которые бы заменяли утилиты командной строки нет, но есть возможность установить дополнительные, из репозитория. Речь пойдет, о сборнике "PowerShell Community Extensions" (Pscx 3.2.2). Данный сборник включаем в себя огромный комплекс командлетов, нас будет интересовать Get-TerminalSession.

Установка "PowerShell Community Extensions" очень проста и выполняется одной командой. Перед установкой Pscx 3.2.2, вам необходимо обновить ваш PowerShell хотя бы до версии 5.1. Далее запускаете оболочку PowerShell от имени администратора и вводите команду:

Пишите на терминальном сервере Get-TerminalSession, или же можете запросить удаленно Get-TerminalSession -ComputerName 192 . 168 . 1 . 51

Если у вас не отработает команда для удаленного вывода, то вам необходимо на удаленном компьютере разрешить выполнение скриптов PowerShell

Get-TerminalSession

Получение информации о сеансе через Get-TSSession

Модуль PSTerminalServices, так же позволяет взаимодействовать с терминальными профилями В состав PSTerminalServices входят вот такие командлеты:

Установка PSTerminalServices проста до безобразия. На первом экране нажимаем "Next".

Установка PSTerminalServices-01

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

Установка PSTerminalServices-02

Для продолжения нажимаем "Install"

Установка PSTerminalServices-03

Установка модуля завершена.

Установка PSTerminalServices-04

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

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Далее проверьте командой, что модуль PSTerminalServices доступен в системе, выполните:

PSTerminalServices

Далее импортируем модуль и запускаем его:

На выходе вы получаете информацию, о всех ваших сеансах пользователей на терминальном столе

Виндовс несет в себе множество идентификаторов операционной системы, которые позволяют узнать конкретный экземпляр ОС - дата установки системы, номер лицензии, VolumeiID, SID, WSUS Client ID, DTC. А есть аналоги в Linux (конкретно - Debian)? Метки конкретного экземпляра ОС, установленного на конкретной машине под конкретным железом. И главное - есть ли источник, в котором можно найти информацию по этому поводу?

Но зойчем, чем мак адрес не устраивает?


Здесь у нас такое не принято, достаточно /etc/os-release.


Вполне может быть почищено какой-нибудь чистилкой логов или вручную. Если дебиан с ненужноД, то есть /etc/machine-id - уникальный (типа, так как там слишком мало символов) иденификатор машины + его можно поменять легко. Так что можно например ориентироватся на макадрес сетевухи. но ее тоже можно вытащить или поменять мак.


Можно идентифицировать машину по серийному номеру винчестера.

Ненужно идентифицировать *глобально*, но для своих нужд — можно настроить /etc/motd и сделать hostname, какое нравится.

И главное - есть ли источник, в котором можно найти информацию

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



Как-раз на днях впервые заметил эту штуку. Лоргугл, скажи зачем оно (не)нужно?

Чтобы куратору было проще.


Ну это само собой, я имею в виду какое официальное обоснование

Create a machine ID for journaling to work. This can be done through the following command:

Создайте идентикационный код машины, для журналирования. Это можно сделать следующей командой:

The command systemd-machine-id-setup also has an impact on the systemd-networkd service. If you don't run this command, strange behavior like network interfaces not coming UP or network addresses not being applied will occur.

Команда systemd-machine-id-setup также влияет на работу systemd-networkd. Если вы не выполните данную команду, то этот сервис будет вести себя непредсказуемо, например сетевые интерфейсы не будут подниматься, или сетевые адреса не будут применены

Есть роутер, он образует локальную подсеть 192.168.0.1/24 В сети той несколько машин, все на Linux. Иногда я использую ssh для управления одной машиной с другой, и в этом нет проблем.

Но для ssh необходимо знать IP компа, так как ssh не понимает hostname, если его нет в /etc/hosts А так как это роутер, то IP динамические.

выводит только активные IP в сети, а

Сейчас смотрю IP и hostname в админке роутера, что не совсем удобно. Я конечно могу всем дать статичные IP, а потом настроить /etc/hosts, но это костыль какой-то.

Нужна команда, что выведет список всех активных IP в подсети 192.168.0.1/24 и их hostnames. Гуглить пробовал, но он путает hostname c netbios, и часть команд под винду, причем без указания этого.



Я бы сделал следующее: На роутере в DHCP забиндил бы существующее розданные ip адреса( если не хочешь делать статики). Те они всегда будут получать один и тот же айпи. Запусти где-нибудь DNS сервер ( на том же роутере, если умеет) и пропиши свои локальные имена. В DHCP пропиши, чтобы при выдаче настроек, машины получали твой DNS в качестве DNS.

В /etc/hosts ничего прописывать не надо,это не совсем тот случай. Нужна одна точка, где все прописано, а не куча.


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


Сейчас смотрю IP и hostname в админке роутера, что не совсем удобно.

Нужна команда, что выведет список всех активных IP

Вот и ответ. Нужен такой робот, который будет за вас смотреть в админке. То есть - модель робота будет зависеть от производителя роутера.



ssh прекрасно понимает hostname, если тот резолвится через dns.


Да вариантов много. Для мелкого применения в рутерах написаны специальные комбайны, содержащие dhcp+dns+etc, например, dnsmasq. Имя можно получать и только от dhcp копаясь в его логах. Ну и куча всяких велосипедных костылей, типа после получения адреса сама машина по www будет делать POST со своим именем :))

arping по всем адресам сети

Собирай адреса arpwatch-ем, тогда проще будет искать активные.

Можно посмотреть в dhcpd.leases и отсортировать по времени.


Ключ не подскажете?

ничего не выдал, я не нашел упоминания, как с его помощью узнать hostname.

И на практике он просто пингует адрес, я это и так могу.

Vsevolod-linuxoid ★★★★★ ( 24.04.17 19:07:28 )
Последнее исправление: Vsevolod-linuxoid 24.04.17 19:10:03 (всего исправлений: 2)


Пожалуйста, полные команды. Я новичек в сетях. man arpwatch не сработал, нет справочной страницы.

Хостнэйм он тебе не поможет узнать, это да. Тогда узнавай либо через ssh на все машины, либо по логам dhcp сервера.


Хостнэйм он тебе не поможет узнать, это да.

Я писал выше, что команда

Как именно это делать? Это вообще можно для клиента, в качестве сервера в сети у меня роутер?

И вообще, если две машины в одной подсети, оба клиенты и знают IP друг друга, то они не могут определить hostname друг друга? Просто задача вроде бы простая, а решения найти не могу.

Vsevolod-linuxoid ★★★★★ ( 24.04.17 19:26:31 )
Последнее исправление: Vsevolod-linuxoid 24.04.17 19:32:15 (всего исправлений: 1)

И вообще, если две машины в одной подсети, оба клиенты и знают IP друг друга, то они не могут определить hostname друг друга?

В общем случае — нет. А что за роутер? А то может там dnsmasq, на котором прописывание в DNS клиентов DHCP делается на раз-два, только взять и сделать?

dexpl ★★★★★ ( 24.04.17 19:37:20 )
Последнее исправление: dexpl 24.04.17 19:38:28 (всего исправлений: 1)

И вообще, если две машины в одной подсети, оба клиенты и знают IP друг друга, то они не могут определить hostname друг друга? Просто задача вроде бы простая, а решения найти не могу.

Потому что соответствие IP -> hostname, так же как и hostname сам по себе, обычно никому не нужно. Зачем тебе хостнэйм, когда у тебя есть адрес? Если тебе нужно взаимодействие двух машин в сети, то выдай им статичные адреса и записи в DNS.

Если нужен autodiscover - в линуксах есть avahi, попробуй покрутить его. Сам я им не пользовался, больше этого подсказать не смогу.

Надо поставить пакет arpwatch и тогда наверное ман будет

arpwatch -f /var/lib/arpwatch/eth0.dat -i eth0

В /var/lib/arpwatch/eth0.dat будут появляться хосты. + письма-оповещения будет слать на arpwatch@localhost

И вообще, если две машины в одной подсети, оба клиенты и знают IP друг друга, то они не могут определить hostname друг друга?

Напрямую нет. Простой пример, вы знаете телефонный номер абонента, по нему можно ли просто так узнать его реальное имя? Или почтовый адрес -> имя отправившего? Подчеркиваю полное соответствие номер/адрес->имя. Скорее нет чем да.
Далее. Даже если у вас dhcp+dns машина клиента не обязана представлять hostname для dhcp, т.е. те варианты которые описаны выше не всегда будут работать.

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