Contents

获取Linux前台和后台进程的进程ID

1. 概述

在 Linux 操作系统中,我们可以在前台或后台模式下运行进程。 有时,从这些进程中检索进程 ID 很重要。在本教程中,我们将在前台和后台运行作业并获取进程 ID。

2. 前台和后台作业

**当我们在前台模式下运行进程时,shell会暂停,直到进程终止。**但是,后台进程独立于shell执行。

2.1.前台进程

我们可以通过直接在命令行中调用来在前台运行一个进程。让我们运行xeyes 进程:

$ xeyes

如果我们在前台运行一个进程,我们可以使用ctrl+z暂停或暂停它并将其发送到后台。

2.2. 后台进程

我们可以*使用*&命令在后台运行相同的进程

$ xeyes &
[2] 3044

然后,使用*jobs *命令,我们可以看到正在后台运行的进程:

$ jobs
[1]+ Running xeyes &

如果一个进程被挂起,我们可以使用bg 命令在后台启动它。然后可以通过*fg *命令在前台运行后台进程。

3. 监控过程

Linux 中的每个进程都有一个称为PID的进程 ID 和一个称为PPID的父进程 ID 。在 Linux 中,ps命令 显示正在运行的进程

$ ps
PID TTY TIME CMD
1937 pts/2 00:00:00 bash
2567 pts/2 00:00:00 ps

此外,我们可以使用ps -auxps -ef显示系统上的所有进程

$ ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 119924 6100 ? Ss 14:52 0:01 /sbin/init spla
root 2 0.0 0.0 0 0 ? S 14:52 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? I< 14:52 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? I< 14:52 0:00 [mm_percpu_wq]
root 7 0.0 0.0 0 0 ? S 14:52 0:00 [ksoftirqd/0]
.
.
blogdemo 2575 0.0 0.1 44432 3328 pts/2 R+ 16:31 0:00 ps -aux

使用*grep ps*,我们可以监控特定进程:

$ xeyes &
[1] 2606
$ ps -aux | grep xeyes
blogdemo 2606 0.1 0.2 48580 4092 pts/2 S 16:41 0:00 xeyes
blogdemo 2608 0.0 0.0 21292 1084 pts/2 S+ 16:42 0:00 grep --color=auto xeyes

此外,通过使用ps -efgrep,我们可以检索PIDPPID

$ xeyes &
[1] 2660
$ ps -ef | grep xeyes
blogdemo 2660 1937 0 16:51 pts/2 00:00:00 xeyes
blogdemo 2662 1937 0 16:51 pts/2 00:00:00 grep --color=auto xeyes

在这种情况下,xeyes进程的PID值为 2660,PPID值为 1937。使用PPID,我们可以找到父进程:

$ ps -ef | grep 1937
blogdemo 1937 1930 0 14:55 pts/2 00:00:00 bash

这向我们展示了xeyes的父进程是bash。最后,我们可以使用ps -l查看当前 bash 中的进程

$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1001  3935  3928  0  80   0 -  7375 wait   pts/1    00:00:00 bash
0 S  1001  4028  3935  1  80   0 - 12145 poll_s pts/1    00:00:00 xeyes
4 R  1001  4029  3935  0  80   0 -  8996 -      pts/1    00:00:00 ps

4. 操作流程

4.1. 获取进程 ID

我们已经看到ps -ef显示来自所有用户的进程,将其与grep结合,我们可以找到一个进程的特定PIDPPID。不过,还有一种更直接的方法:

$ xeyes &
[3] 2726
$ ps -C xeyes -o user,pid
USER PID
blogdemo 2726

在这里,我们使用 -C 选项仅返回xeyes进程的匹配项,使用*-o选项返回特定列。此外,**我们可以使用jobs -l*查看进程 ID :**

$ xeyes &
[1] 2546
$ jobs -l
[1]+ 2546 Running

此外,$ ! 命令返回最后一个后台进程的 PID

$ xeyes &
[1] 2546
$ cat $!
cat: 2546: No such file or directory

4.2. 杀死进程

在 Linux 中,我们可以通过信号来控制进程。事实上,当我们按下ctrl+cctrl+z时,我们也在向进程发送信号。kill 命令允许我们停止一个进程。该命令使用不同的信号,具体取决于我们应该如何终止进程:

 signal number | signal name | meaning 
     15        |   SIGHUP    | normal terminate request 
      9        |   SIGKILL   | force kills the procsess

让我们使用kill来停止xeyes进程:

$ xeyes &
[1] 2390
$ kill 2390
$ jobs
[1]+ Terminated xeyes

该进程由kill命令正常关闭(SIGHUP) 。我们可以通过kill -9命令强制关闭进程:

$ xeyes &
[1] 2402
$ kill -9 2402
$ jobs
[1]+ Killed xeyes

让我们使用jobs -l找到进程 ID,然后终止该进程:

$ xeyes &
[1] 2546
$ jobs -l
[1]+ 2546 Running
$ kill -9 2546
$ jobs
[1]+ Killed xeyes