Linux:如何知道进程从哪里开始以及如何启动?


33

我正在检查一个Linux机器,发现正在运行一个perl进程,并很好地共享了CPU的使用率。使用top时,我只能输入进程名称。

当我按c来查看命令行时,它显示了/ var / spool / mail。这没有意义,因为这是目录。

我的问题是:

1)为什么会这样?这个perl进程如何掩盖其命令行?2)查找流程从何处开始以及如何开始的最可靠方法是什么?

谢谢!

Answers:


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);
}

如果将其编译到名为“ 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

1
总而言之,文件中的文件/proc将提供有关程序的所有信息,exe将是可执行文件的链接,cwd当前工作目录的fd链接,该目录包含打开文件的链接(包括标准输入,输出和标准错误)
Hubert Kario

57

最可靠的方法是查看/proc该进程的目录。每个进程都有一个/proc/<pid>/目录,用于存放以下信息:

  1. cwd 链接到当前工作目录
  2. fd 包含打开文件链接的目录(文件描述符)
  3. cmdline 阅读它以查看用于启动该过程的命令行
  4. environ 该过程的环境变量
  5. root 指向该进程认为其根目录的链接(除非是chroot,否则为/)

每个进程/ proc上都有更多很酷的信息,但是有了上面的信息,您将可以准确知道正在发生什么。

另外,使用ps auxf还会显示谁分叉了什么,因此您可能会更好地了解谁在调用perl。


我一直在Windows上使用Process Explorer,想知道在Linux上是否有等效的浏览器。那个开关就可以了!ps auxf ...太好了!
Yanick Girouard 2013年

1
+1为ps的f参数,这对我有用!
Lennart Rolland 2014年

2
+1教我看似如此基本的概念... /proc包含过程信息!谁知道??我曾经看着那里是versioncpuinfo和东西...加上这解决了我的实际问题,因为我的路由器的PS版本忽略所有参数
NACHT -恢复莫妮卡

@coredump:如果chroot()之前调用过该进程,我怎么知道哪个目录/proc/ᴘɪᴅ/cwd对应?
user2284570

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-当前目录。e-正在运行的可执行文件。f-打开文件。在默认显示模式下省略f。r-根目录。m-映射文件或共享库。

也许它将帮助您推进搜索以寻找所需的答案。我不知道它是否对您有帮助,但也许您会发现一些有用的信息。


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)

这将提供有关启动过程的systemd服务的信息。

我在这里找到了这个提示

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.