Откуда запущен процесс linux

Linux: Как узнать, где был запущен процесс и как он был запущен?

Я проверял коробку Linux и обнаружил, что Perl-процесс запущен и занимает довольно много времени при использовании процессора. С вершины я мог бы только perl в имени процесса.

Когда я нажал c , чтобы просмотреть командную строку, он показал / var / spool / mail. Что не имеет смысла, так как это каталог.

1) Почему это произошло? Как этот процесс Perl может маскировать свою командную строку? 2) Какой самый надежный способ узнать, где и как был запущен процесс?

В большинстве случаев достаточно просто запустить ps вместе с вашими любимыми флагами, чтобы обеспечить широкий вывод. Я склоняюсь к ps -feww , но другие предложения здесь будут работать. Обратите внимание, что если программа была запущена кем-то другим $PATH , вы увидите только имя исполняемого файла, а не полный путь. Например, попробуйте это:

$ lftp & $ ps -feww | grep ftp lars 9600 9504 0 11:30 pts/10 00:00:00 lftp lars 9620 9504 0 11:31 pts/10 00:00:00 grep ftp 

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

int main (int argc, char **argv)

Если я скомпилирую это в файл с именем «myprogram» и запусту его:

$ gcc -o myprogram myprogram.c $ ./myprogram & [1] 10201 

А затем запустите ps , я увижу другое имя процесса:

$ ps -f -p 10201 UID PID PPID C STIME TTY TIME CMD lars 10201 9734 0 11:37 pts/10 00:00:00 foobar 

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

$ls -l /proc/9600/exe lrwxrwxrwx. 1 lars lars 0 Feb 8 11:31 /proc/9600/exe -> /usr/bin/lftp 

В общем, все файлы в /proc предоставят всю информацию о программе, exe будут ссылкой на исполняемый файл, cwd на текущий рабочий каталог, fd каталог содержит ссылки на открытые файлы (включая стандартный ввод, вывод и стандартную ошибку)

Самый надежный способ — взглянуть на /proc каталог процесса. Каждый процесс имеет /proc// каталог, в котором хранится такая информация, как:

  1. cwd ссылка на текущий рабочий каталог
  2. fd каталог со ссылками на открытые файлы (файловые дескрипторы)
  3. cmdline прочитайте его, чтобы увидеть, какая командная строка была использована для запуска процесса
  4. environ переменные среды для этого процесса
  5. root ссылка на то, что процесс считает своим корневым каталогом (он будет / если не будет изолирован)
Читайте также:  Просмотр текущих процессов linux

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

Кроме того, использование ps auxf покажет вам, кто разветвляется, и вы сможете лучше понять, кто вызывает ваш Perl.

Я всегда использую Process Explorer в Windows и спрашиваю себя, существует ли аналог в Linux. Этот переключатель делает все это! ps auxf . приятно!

+1 за то, что научил меня тому, что кажется таким фундаментальным понятием . /proc содержит информацию о процессе! кто знал?? все, что я когда-либо искал там, было version и cpuinfo все такое . плюс это решает мою реальную проблему, потому что версия моего маршрутизатора ps игнорирует все параметры

@coredump: и если процесс вызывался chroot() раньше, как я могу узнать, какой каталог /proc/ᴘɪᴅ/cwd соответствует?

для меня, только сейчас, я обнаружил, что pstree дал гораздо более четкое представление о том, как процесс был запущен, чем ps aux

 ├─lightdm─┬─Xorg │ ├─lightdm─┬─init─┬─apache2───2*[apache2───26*[]] │ │ │ ├─at-spi-bus-laun─┬─dbus-daemon │ │ │ │ └─3*[] │ │ │ ├─at-spi2-registr─── │ │ │ ├─dbus-daemon │ │ │ ├─dropbox───29*[ ] 

Попробуйте ps axww | grep perl получить полную командную строку вашего процесса. Похоже, top только что обрезал длинную линию.

Источник

Как определить, откуда приложение запущено?

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

2 ответа 2

Вы можете узнать, какой исполняемый файл будет запущен с помощью команды

Если вы хотите определить путь программным путем, вы используете неверный обмен стека.

Проблема простого решения

which command находит исполняемый файл данной command в вашем $PATH . К сожалению, это не будет работать, как ожидалось, во всех случаях.

Когда command является псевдонимом или функцией, вы не получите правильный результат, потому что фактический исполняемый файл может иметь совершенно другое имя. Например, во многих дистрибутивах Linux псевдоним ll установлен по умолчанию. which ll не найдет ничего. Другой проблемный случай, когда ваша оболочка ведет себя нестандартным образом и не запускает первую command найденную в $PATH .

Более надежное решение

В Linux, если вы хотите быть полностью уверены в пути к исполняемому файлу запущенного процесса, вы можете получить его из его PID (ID процесса; в приведенном ниже примере вместо $PID ):

Как получить номер? PID последнего запуска процесса в оболочке в фоновом режиме — $! , Небольшая демонстрация:

sleep 20 & readlink /proc/$!/exe 

Вы можете получить PID других процессов, например, из списка процессов, используя ps -ef .

Объяснение: /proc/$PID/exe — это символическая ссылка на исполняемый файл запущенного процесса. Команда readlink показывает цель, на которую указывает символическая ссылка.

Читайте также:  Настройка rdp подключения linux

Скрипты — это особый случай

К сожалению, метод readlink /proc/$PID/exe не работает должным образом с такими языками сценариев, как bash, Perl, Python и т.д. В таких случаях вы получите путь к интерпретатору сценария (например, /bin/bash ) вместо путь к сценарию. Чтобы приблизиться к информации, вы можете использовать:

cat /proc/$PID/cmdline # the commandline with the interpreter and script readlink /proc/$PID/cwd # the current working directory 

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

Все может измениться

Любой процесс может вызвать exec() который заменяет его /proc/$PID/exe , /proc/$PID/cmdline и другую информацию.

Источник

Работа с процессами в Linux

Обновлено

Обновлено: 29.03.2023 Опубликовано: 09.11.2017

Список процессов

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 — текущее состояние процесса. Могут принимать значения:
    1. R — выполнимый процесс;
    2. S — спящий;
    3. D — в состоянии подкачки на диске;
    4. T — остановлен;
    5. Z — зомби.
    6. W — не имеет резидентных страниц;
    7. < —высоко-приоритетный;
    8. N — низко-приоритетный;
    9. L — имеет страницы, заблокированные в памяти.
  • START — дата запуска процесса.
  • TIME — время запуска процесса.
  • COMMAND — команда, запустившая процесс.

Ключи

Ключ Описание
-A Все процессы.
-a Запущенные в текущем терминале, кроме главных системных.
-d Все, кроме главных системных процессов сеанса.
-e Все процессы.
f Показать дерево процессов с родителями.
T Все на конкретном терминале.
a Все, связанные с текущим терминалом и терминалами других пользователей.
r Список только работающих процессов.
x Отсоединённые от терминала.
u Показать пользователей, запустивших процесс.

Примеры

Поиск процесса с помощью grep:

Убить процесс

Останавливаем процесс по его PID:

Если процесс не завершается, убиваем его принудительно:

Остановить все процессы с именем nginx:

Как и в случае с kill, можно это сделать принудительно:

Можно остановить все процессы конкретного пользователя:

Ищем процесс по имени, извлекаем его PID и завершаем его:

Читайте также:  Linux подключить диск mount

kill `ps aux | grep ‘apache’ | awk »`

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

Подробная информация о процессе

Для каждого процесса создается каталог по пути /proc/ , в котором создаются папки и файлы с описанием процесса.

Примеры использования /proc/

Адрес в ячейках оперативной памяти, которые занял процесс:

Команда, которой был запущен процесс:

Символьная ссылка на рабочий каталог процесса:

Символьная ссылка на исполняемый файл, запустивший процесс:

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

Подробное описание на сайте man7.org.

Потребление ресурсов процессами

Для просмотра статистики потребления ресурсов используем утилиту top:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21059 root 20 0 157884 2280 1496 R 18,8 0,1 0:00.03 top
1 root 20 0 190996 2964 1652 S 0,0 0,1 6:49.99 systemd
2 root 20 0 0 0 0 S 0,0 0,0 0:01.78 kthreadd
3 root 20 0 0 0 0 S 0,0 0,0 0:24.75 ksoftirqd/0
5 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/0:0H

  • PID — идентификатор процесса.
  • USER — имя учетной записи, от которой запущен процесс.
  • PR — приоритет процесса.
  • NI — приоритет, выставленной командой nice.
  • VIRT — объем виртуальной памяти, потребляемый процессом.
  • RES — объем используемой оперативной памяти.
  • SHR — количество разделяемой памяти, которое используется процессом.
  • S — состояние процесса.
  • %CPU — процент использования процессорного времени.
  • %MEM — потребление оперативной памяти в процентах.
  • TIME — использование процессорного времени в секундах.
  • COMMAND — команда, которая запустила процесс.

Источник

Как выяснить, что linux запускает при старте?

Есть система в которой запускается некоторая программа, мне надо выяснить где она лежит и что с нею ещё запускается.
В стандартном выводе консоли ничего похожего нет, в основном стандартные службы.
Может можно включить более подробный вывод, где будут все команды sh прописаны?
Помогите пожалуйста )

bk0011m

CityCat4

lacredin: Про то, какой дистрибутив. Потому что он него существенным образом зависит, как запускаются программы при старте. Если есть /etc/.rc.d или /etc/init.d — то в них обычно стартовые скрипты или ссылки на них, имя скрипта обычно совпадает с именем программы

# strace -ff /usr/bin/программа

RiseOfDeath

ArXen42

Если дистрибутив на systemd, то можно заглянуть в его журнал (journalctl -b), да и в обычном top/htop должно висеть. Далее, обычно пакетные менеджеры умеют в поиск пакета по исполняемому файлу и наоборот, вывод файлов, принадлежащих пакету и т.д. Далее, можно (в случае systemd) посмотреть файл сервиса этой программы — там должно быть указано, что с ней запускается (для других init систем тоже должен быть аналог, зависит от дистра).
Глубоко в этих вопросах я не копался, но будь у меня такая проблема, решал бы подобным образом.

Войдите, чтобы написать ответ

Безопасен ли линукс для хранения файлов?

Источник

Оцените статью
Adblock
detector