Я проверял коробку Linux и обнаружил, что процесс Perl работает и принимает значительную долю использования процессора. С помощью top я мог только perl в имени процесса.
Когда я нажал c, чтобы просмотреть командную строку, она показывала / var / spool / mail. Что не имеет смысла, поскольку это каталог.
Мои вопросы:
1) Почему это произошло? Как этот процесс perl может замаскировать свою командную строку? 2) Какой самый надежный способ узнать, где и как был запущен процесс?
Спасибо!
Самый надежный способ - посмотреть на /proc
dir для процесса. Каждый процесс имеет /proc/<pid>/
каталог, в котором хранится такая информация, как:
cwd
ссылка на текущий рабочий каталогfd
каталог со ссылками на открытые файлы (файловые дескрипторы)cmdline
прочтите, чтобы узнать, какая командная строка использовалась для запуска процессаenviron
переменные среды для этого процесса 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, которые запустили ваш процесс.
Я нашел этот намек Вот