Назад | Перейти на главную страницу

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

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

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

Мои вопросы:

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

Спасибо!

Самый надежный способ - посмотреть на /proc dir для процесса. Каждый процесс имеет /proc/<pid>/ каталог, в котором хранится такая информация, как:

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

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

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

В большинстве случаев просто работает 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);
}

Если я скомпилирую это в файл с именем «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/<pid>/exe, который может быть символической ссылкой на соответствующий исполняемый файл. В приведенном выше примере это дает вам гораздо больше полезной информации, чем ps:

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

для меня, только сейчас, я обнаружил, что 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} ]

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

Попробуйте использовать команду fuser -vu /var/spool/mail Эта команда покажет вам PID процессов, использующих указанные файлы или файловые системы. В режиме отображения по умолчанию за каждым именем файла следует буква, обозначающая тип доступа:

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

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

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

На ум приходят две команды:

1) получить время начала процесса из 'пс'.

$ 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 /" многое вам расскажет!

ты можешь использовать:

systemctl status <PID>

или с названием процесса:

systemctl status $(pgrep perl)

Это предоставит информацию о службах systemd, которые запустили ваш процесс.

Я нашел этот намек Вот