列出Linux中正在运行的进程的5个示例

时间:2020-01-09 10:41:45  来源:igfitidea点击:

如何在Linux中按用户和名称列出进程?
如何检查进程是否由pid运行?
如何检查过程状态?
使用哪个命令来杀死进程?

在本教程中,我们将涵盖所有这些问题,并探索不同的命令和工具以列出和管理Linux和Unix中的进程。
ps命令是列出服务器中所有正在运行的进程的最佳工具。
ps可使用多种参数来根据我们的要求列出进程。

列出所有正在运行的进程

方法1:使用" px aux"

要使用BSD语法列出系统上的每个进程,请执行以下操作:

# ps aux

其中

ax     Lift the BSD-style "only yourself" restriction, which is imposed upon the set of all
       processes when some BSD-style (without "-") options are used or when the ps personality
       setting is BSD-like.
u      Display user-oriented format.

这将为我们提供一长串输出,其中包含有关各个进程的更多详细信息,例如内存和cpu的使用情况,状态,进程的用户所有者等。

方法2:使用" ps -ef"

下一个方法将使用标准语法列出所有正在运行的进程:

# ps -ef

其中

-e     Select all processes
 -f     Do full-format listing.

ps aux相比,这提供的信息更少:

方法3:使用" ps -ely"

我们可以在ps中使用更多参数来列出Linux中正在运行的进程:

# ps -ely

其中

-e     Select all processes.
-l     Long format
-y     Do not show flags; show rss in place of addr

ps -ef相比,该命令将为我们提供更多详细信息,例如优先级和各个进程的实用价值。

按用户列出进程

要列出基于用户所有者的所有进程,我们可以使用以下语法:

ps -U USER -u USER u

其中

-U userlist   Select by real user ID (RUID) or name.  It selects the processes whose real user name or
              ID is in the userlist list.  The real user ID identifies the user who created the
              process,
			  
-u userlist   Select by effective user ID (EUID) or name.  This selects the processes whose effective
              user name or ID is in userlist.
u             Display user-oriented format.

列出由root用户启动的进程:

~]# ps -U root -u root u

列出普通用户hynman启动的进程:

~]# ps -U hynman -u hynman u
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
hynman    5575  0.0  0.0 280884  8508 ?        S    Oct20   0:05 python /opt/hynman/jboss/bin/dualprim_watch.py -a 20 -m 500 -U nds -L 500 -t 10
hynman    8995  0.0  0.0 113420  1628 ?        S    Oct20   0:00 /bin/sh /opt/hynman/jboss/bin/standalone.sh -b 0.0.0.0 -c standalone-full-adm.xml
hynman    9208  2.9  3.6 23510668 4848336 ?    Sl   Oct20  50:04 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre/bin/java -D[Standal

列出进程树

方法1:使用" ps axjf"或者" ps -ef --forest"

我们还可以使用" ps"命令以树格式列出正在运行的进程,以了解父进程和子进程。

~]#  ps axjf

或者

~]#  ps -ef --forest

方法2:使用pstree

虽然如果我们希望使用pstree来查看所有正在运行的进程的结构,则可以用上述命令更好地替代,这是RHEL/CentOS发行版中psmisc rpm的一部分。
此命令用于以分层格式显示父子关系。

~]#  pstree -p

其中

-p     Show PIDs.  PIDs are shown as decimal numbers in parentheses after each process name

要列出由单个用户启动的流程的流程树,我们可以使用

~]# pstree -p USERNAME

例如,显示用户hynman的进程树:

~]# pstree -p hynman

我们可以检查pstree的手册页以获取更多受支持选项的列表。

列出单个进程的线程数

我们可以使用-L参数列出线程数以及各个进程。
它将在输出中添加一个新列,可能带有LWPNLWP

~]# ps -eLf

用用户定义的格式列出流程

默认情况下," ps"将显示某些默认的列列表。
我们可以使用以下语法来操纵和打印自己的列集,以获取所需的过程详细信息:

ps -eo ARUMENTS

其中我们可以使用ps手册页中受支持的值列表替换ARGUMENTS

示例1:仅显示PID和命令

只显示PID及其各自命令的列表:

~]# ps -eo pid,comm
    PID COMMAND
      1 systemd
      2 kthreadd
      3 rcu_gp
      4 rcu_par_gp
      6 kworker/0:0H-kblockd
      ...

示例2:显示每个进程的内存和cpu详细信息

我们可以使用不同的参数来打印单个进程的内存和与cpu相关的信息,这里我合并了一些:

~]# ps -eo pid,%mem,%cpu,rss,rsz,vsz,comm 
    PID %MEM %CPU   RSS   RSZ    VSZ COMMAND
....
    902  0.2  0.0 14420 14420 424800 sssd
    904  0.1  0.0  5220  5220  82744 avahi-daemon
    905  0.4  0.0 22152 22152 1626068 polkitd
    912  0.2  0.0 14640 14640 462728 ModemManager
    914  0.0  0.0  2012  2012  18872 lsmd
    916  0.0  0.0  2136  2136  17408 mcelog
....

获取进程的进程ID

现在假设我们有一个要获取其PID的正在运行的进程,因此我们可以再次使用以下格式的ps

ps -C PROCESS -o pid=

其中我们需要用要对其执行PID查找的过程或者命令的名称替换" PROCESS"。
例如,要获取rsyslogd进程的PID:

~]# ps -C rsyslogd -o pid=
   1540

类似地,获取sshd守护进程的PID列表

~]# ps -C sshd -o pid=
    999
   1705
   1899
   2009
   2011
   2319
   2321
   2342
   2344
  13874
  13879

使用PID获取进程名称

现在,如果情况相反,即我们具有PID,并且希望获取映射PID的过程或者命令,则可以使用以下格式:

ps -q PID -o comm=

其中将PID替换为我们必须对其执行查找的进程的pid值。
以下是一些使用PID值获取进程名称的示例。

~]# ps -q 2009 -o comm=
sshd
~]# ps -q 1 -o comm=
systemd

列出已停止的进程

我们可以使用ctrl + z快捷键停止正在运行或者已挂起的进程。
当我们按下此组合键时,终端上正在进行的过程将被强制停止。

例如,其中我有一个SFTP会话,该会话被卡住了,所以我按了ctrl + z强制停止了该进程,该进程立即停止了该进程并返回控制台。

~]# sftp -o Port=2222 [email protected]
[email protected]'s password:
Connected to [email protected].
sftp> exit
Interrupt
^Z
[3]+  Stopped                 sftp -o Port=2222 [email protected]

要列出所有处于停止状态的进程,请使用" jobs"命令

~]# jobs
[1]   Stopped                 sftp -o Port=2222 [email protected]
[2]-  Stopped                 sftp -o Port=2222 [email protected]
[3]+  Stopped                 sftp -o Port=2222 [email protected]

因此,当前在我的服务器中,我有3个已停止的进程。
为了杀死一个停止的进程,我们使用

kill %[JOB ID]

其中,"作业ID"是我们在方括号下看到"已停止"的ID号。

因此,例如,要终止作业ID为3的进程,我们将使用:

~]# kill %3
[3]+  Stopped                 sftp -o Port=2222 [email protected]

接下来,如果我检查当前已停止的进程,那么我会看到作业ID为3的进程被标记为Exit(退出),这意味着该进程即将被杀死(几乎死亡)。

~]# jobs
[1]   Stopped                 sftp -o Port=2222 [email protected]
[2]-  Stopped                 sftp -o Port=2222 [email protected]
[3]+  Exit 1                  sftp -o Port=2222 [email protected]

几秒钟后,我们再次检查了状态,列表中不再显示具有作业ID 3的进程,并且该进程已成功终止

]# jobs
[1]-  Stopped                 sftp -o Port=2222 [email protected]
[2]+  Stopped                 sftp -o Port=2222 [email protected]