Linux: Як дізнатися, з чого розпочався процес і як його запустили?


33

Я перевіряв прапорець Linux і виявив, що запускається процес Perl, який займає частку використання процесора. Зверху, я міг лише впертися в назву процесу.

Коли я натиснув c , щоб переглянути командний рядок, він показав / var / spool / mail. Що не має сенсу, оскільки це каталог.

Мої запитання:

1) Чому це сталося? Як цей процес perl міг замаскувати його командний рядок? 2) Який найнадійніший спосіб з’ясувати, де і як розпочався процес?

Спасибі!

Відповіді:


36

У більшості випадків 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) {
        memset(argv[0], ' ', strlen(argv[0]));
        strcpy(argv[0], "foobar");
        sleep(30);
        return(0);
}

Якщо я компілюю це у файл під назвою "мояпрограма" і запускаю його:

$ 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/<pid>/exe, що може бути символьним посиланням на відповідний виконуваний файл. У наведеному вище прикладі це дає набагато більше корисної інформації, ніж ps:

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

1
загалом, файли в /procнададуть всю інформацію про програму, exeбудуть посиланням на виконуваний файл, cwdна поточну робочу директорію, fdкаталог містить посилання на відкриті файли (включаючи стандартний ввід, вихід та стандартну помилку)
Hubert Kario

57

Найнадійніший спосіб - це дивитись на /procцей процес. Кожен процес має /proc/<pid>/каталог, де зберігається така інформація, як:

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

Існує більше цікавої інформації про кожен процес / процес, але з вищепереліченими ви зможете точно знати, що відбувається.

Крім того, використання ps auxfпокаже вам, хто розігнав що, щоб ви могли краще зрозуміти, хто дзвонить на ваш перл.


Я завжди використовую Process Explorer у Windows і цікавився, чи є еквівалент у Linux. Цей перемикач робить це все! ps auxf ... приємно!
Янік Жируар

1
+1 для параметра f для ps, що зробив це для мене!
Леннарт Ролленд

2
+1 для того, щоб навчити мене, як виглядає таке фундаментальне поняття ... /procмістить інформацію про процес! хто знав?? все, що я коли-небудь шукав, там було versionі cpuinfoінше ... плюс це вирішує мою актуальну проблему, тому що версія мого маршрутизатора ps ігнорує всі параметри
Nacht - Reinstate Monica

@coredump: і якщо процес викликався chroot()раніше, як я можу знати, якому каталогу /proc/ᴘɪᴅ/cwdвідповідає?
користувач2284570

10

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

це виглядає приблизно так:

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

2

Спробуйте ps axww | grep perlотримати повний командний рядок вашого процесу. Схоже, topщойно обстрижена довга лінія.


2

Спробуйте використовувати команду fuser -vu /var/spool/mail Ця команда покаже вам PID-процеси процесів із використанням вказаних файлів або файлових систем. У режимі відображення за замовчуванням кожне ім'я файла супроводжується буквою, що позначає тип доступу:

c - поточний каталог. електронний виконуваний файл. f - відкритий файл. f пропущено в режимі відображення за замовчуванням. r - кореневий каталог. m - файл mmap'ed або спільна бібліотека.

Можливо, це допоможе вам просунутись вперед, щоб відповісти, що ви шукаєте. Я не знаю, чи допоможе вам, але, можливо, ви дізнаєтесь корисну інформацію.


1

Якщо ви не ознайомитесь із довідковою сторінкою для точних прапорів, простий спосіб визначити, який командний рядок і час початку, ps auxwww повинен працювати. Ви можете зробити її більш елегантною, якщо бажаєте, прочитавши чоловічу сторінку.


1

Дві команди приходять в голову:

1) отримати час початку процесу з ' ps '.

$ ps -ax -o pid,start,comm
  PID  STARTED COMMAND         USER
    1   Feb 06 init            root
    2   Feb 06 kthreadd        root
[...]
  13147 19:09:48 chrome          hcooper
  13270 19:13:51 chrome          hcooper
  13386 19:18:34 bash            hcooper

2) lastcomm , який зараз я перевіряю, я не встановив. У будь-якому випадку в описі чоловічої сторінки написано:

   lastcomm prints out information about previously executed commands. If
   no arguments are specified, lastcomm will print info about all of the
   commands in acct (the record file).

Але, як мало хто сказав, "ls -al / proc /" скаже вам багато чого!


0

Ви можете використовувати:

systemctl status <PID>

або з назвою процесу:

systemctl status $(pgrep perl)

Це дасть інформацію про системні сервіси, які розпочали ваш процес.

Я знайшов тут цей натяк

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.