Linux:如何知道进程是从哪里开始的?

我正在检查一个Linux机器,发现一个perl进程正在运行,并占用了很多的CPU使用。 顶部,我只能在进程名perl。

当我按c时 ,查看命令行,它显示/ var / spool / mail。 这是没有道理的,因为这是目录。

我的问题是:

1)为什么发生这种情况? 这个perl进程如何屏蔽它的命令行? 2)什么是最可靠的方法来找出在哪里和如何开始一个过程?

谢谢!

在大多数情况下,仅仅运行ps通常就足够了,还有你最喜欢的标志来实现宽输出。 我倾向于ps -feww ,但这里的其他build议将起作用。 请注意,如果某个程序是从某人的$PATH启动的,那么只会看到可执行文件的名称,而不是完整的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 

最可靠的方法是查看过程的/proc目录。 每个进程都有一个/proc/<pid>/目录,其中保存的信息如下:

  1. cwd链接到当前工作目录
  2. fd一个带有打开文件链接的文件(文件描述符)
  3. cmdline阅读它,看看用什么命令行来启动进程
  4. environ该过程的环境variables
  5. root到什么进程认为它的根目录的链接(它将/除非chrooted)

每个进程/进程都有更多的有用信息,但是对于上面的那些进程,你将能够完全知道发生了什么。

另外,使用ps auxf会告诉你谁分叉什么,以便你可以更好地了解谁在叫你的Perl。

对我来说,就在现在,我发现pstreeps 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 ps axww | grep perl来获取你的进程的完整命令行。 它看起来像刚刚修剪了一条长长的线。

尝试使用命令fuser -vu /var/spool/mail此命令将显示使用指定文件或文件系统的进程的PID。 在默认显示模式下,每个文件名后跟一个表示访问types的字母:

c – 当前目录。 电子可执行程序正在运行。 f – 打开文件。 在默认显示模式下,f被省略。 r – 根目录。 m – mmap'ed文件或共享库。

也许它会帮助你前进你的search来回答你正在寻找。 我不知道这是否对你有帮助,但也许你会find一些有用的信息。

不要咨询man页面的确切的标志,一个简单的方法来资助什么命令行和开始时间,ps auxwww应该工作。 您可以通过阅读手册页,使其更优雅。

两个命令让人想起:

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). 

但是正如less数人所说的,“ls -al / proc /”会告诉你很多!