Linux基础学习教程

Linux 基础教程 37-进程命令

2018-08-15  本文已影响0人  Surpassme

pidof

    我们知道每个小孩一出生就会一个全国唯一的编号来对其进行标识,用于以后上学,办社保等,就是我们的身份证号。那么在Linux系统中,用来管理运行程序的标识叫做PID,就是大家熟知的进程ID。那么如何来找到程序的PID了,那么就需要用到命令pidof,其功能主要用来查看运行程序的PID。

基本用法

pidof [选项] [程序名]

其常用选项参数如下所示:

选项 说明
-s 仅返回一个PID
-c 仅返回具有相同root目录的PID
-x 显示由脚本开启的进程
-o omitpid 忽略指定的PID
pidof命令的返回值通常只有两个:
- 0:pidof命令至少找到一个对应的PID
- 1:pidof没有找到任何匹配的PID

用法示例

1、显示运行程序的PID

[root@localhost ~]# pidof sshd
34128 34059 28835 28820 24697 24627 23228 23215 1995

在显示的结果可以看到共有9个PID,则说明服务器上9个进程均是由sshd启动的。

2、显示Shell的进程

[root@localhost ~]# cat test.sh
#!/bin/bash
i=1;
while [ $i -le 10000 ]
do
 echo $i
 i=$((i+1))
 sleep 120s
done
[root@localhost ~]# ./test.sh &
[root@localhost ~]# pidof -x test.sh
36554

3、显示指定程序的PID

[root@localhost ~]# pidof -s sshd
7524

4、忽略指定的PID

[root@localhost ~]# pidof sshd
9104 9103 7524 7434 4474 4462 1995
[root@localhost ~]# pidof sshd -o 1995
11979 11978 7524 7434 4474 4462

lsof

    在Windows中删除文件时,会出现被占用而暂时无法删除的情况,这个我们会一款非常好用的软件Unlocker,那么在Linux中类似的情况如何处理了?今天我们来学习lsof命令。
    lsof全称list open files。用于查看进程打开的文件、目录和套接字等信息。

基本用法

pidof [选项] [文件名]

其常用选项参数如下所示:

选项 说明
-?或-h 显示帮助信息
-a 显示打开文件存在的进程
-c 进程名 显示指定进程所打开的文件
-d FD 显示文件描述符(FD)占用的进程
+d 目录名 显示当前目录下被打开的文件
+D 目录名 递归显示当前目录下被打开的文件
-i 条件 显示符合条件的进程
-p pid 显示指定PID打开的文件
-u uid 显示指定UID打开的文件
-g 显示所属组标识符PGID
R 显示父进程PPID

其中选项 -i 支持的条件如下所示:

条件 说明 示例
4/6 IPv4/ IPv6 lsof -i
protocol UDP/TCP lsof -i TCP
hostname 网络主机名 lsof -i@localhost
hostaddr 网络地址 lsof -i@192.168.8.8
service 服务名称,可查看/etc/services lsof -i:ssh
port 端口 lsof -i:22

lsof输出的详细信息解释如下:

文件描述符FD,但却可以表示两类内容:

01文件描述符.jpg

用法示例

1、通过文件定位占用的进程

[root@localhost ~]# top -d 2 > top.txt
[root@localhost ~]# lsof top.txt
lsof:WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
  Output information may be incomplete.
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
top     8900 root    1w   REG    8,2    69035 469790741 top.txt

2、通过文件描述符定位进程

[root@localhost ~]# lsof -d 5 | head -3
lsof:WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
   Output information may be incomplete.
COMMAND  PID  USER   FD   TYPE      DEVICE SIZE/OFF NODE       NAME
systemd  1    root   5u   a_inode   0,10     0     7450       [signalfd]
Xvnc     2678 root   5u   IPv6      41776    0t0   TCP *:6003 (LISTEN)

3、通过进程定位文件

[root@localhost ~]# ps -ef |grep -i  mysql | grep -v grep
mysql 2680  1  2 7月19 ?  11:44:50 /usr/libexec/mysqld --basedir=/usr
[root@localhost ~]# lsof -p 2680 | head -3
lsof:WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
     Output information may be incomplete.
COMMAND  PID  USER   FD    TYPE  DEVICE SIZE/OFF  NODE   NAME
mysqld  2680  mysql  cwd   DIR   8,2    4096      319571 /var/lib/mysql
mysqld  2680  mysql  rtd   DIR   8,2    254       512    /

4、查看用户打开的文件

[root@localhost ~]# lsof -u root | tail -3
lsof:WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
   Output information may be incomplete.
COMMAND   PID   USER  FD     TYPE DEVICE  SIZE/OFF NODE NAME
kworker/3 39337 root  cwd    DIR  8,2     254      512  /
kworker/3 39337 root  rtd    DIR  8,2     254      512  /
kworker/3 39337 root  txt   unknown                     /proc/39337/exe

5、查看程序所占用的端口

[root@localhost ~]# lsof -i:22
COMMAND PID    USER   FD  TYPE  DEVICE      SIZE/OFF NODE NAME
sshd    27597  root   3u  IPv4 1460505039   0t0      TCP *:ssh (LISTEN)
sshd    27597  root   4u  IPv6 1460505041   0t0      TCP *:ssh (LISTEN)

fuser

    fuser主要用于显示进程正在使用的文件、套接字、挂载点等。

基本用法

fuser [选项] [文件名]

其常用选项如下所示:

选项 说明
-a ,--all 显示命令行中指定的所有文件
-c 同-m选项,用于兼容POSIX
-k, --kill 杀掉使用文件的进程
-i, --interactive 杀掉进程前需要用户确认,如果无-k参数则默认忽略该参数
-l, --list-signals 显示所有已知的 signal名称
-m NAME, --mount NAME 指定一个挂载的文件系统或被挂载的设备
-n SPACE 指定一个不同的命名空间,支持不同的命名空间文件(默认为文件名)、UDP(本地UDP端口)、TCP(本地TCP端口),为避免歧义,可以使用name/space形式,如80/tcp
-w 仅杀掉拥有写入权限的进程,如果无-k参数则默认忽略该参数
-s, --silent 静默模式,-u和-v忽略该参数
-u, --user 在PID后显示所属的用户名
-v, --verbose 显示详细信息
-4, --ipv4 仅搜索IPv4的套接字
-6, --ipv6 仅搜索IPv6的套接字

fuser显示指定文件或文件系统的进程PID,在默认模式中,每个文件名后面会用一个字母表示访问类型,如下所示:

-f 和 -F 只有与选项 -v 一起使用的时候才会显示,其他情况则默认不显示

用法示例

1、杀掉所有占用/home的进程

[root@localhost ~]# fuser -km /home

2、显示本地所有mysql上端口进程

[root@localhost ~]# fuser mysql/tcp
mysql/tcp:            2680

3、显示详细的信息

[root@localhost ~]# fuser -v top.txt
                     用户     进程号  权限   命令
/root/top.txt:       root     15847 F....  top

4、查看有多个进程正在使用某个目录下文件系统,包含子目录

[root@localhost ~]# fuser -v -m /home/data
                     用户     进程号 权限   命令
/home/data:          root     kernel mount /home/data

5、通过端口定位进程

[root@localhost ~]# fuser -v -n tcp 22
                     用户     进程号 权限   命令
22/tcp:              root      27597 F.... sshd
                     root      31119 F.... sshd
或
[root@localhost ~]# fuser -v 22/tcp
                     用户     进程号 权限   命令
22/tcp:              root      27597 F.... sshd
                     root      31119 F.... sshd

fuser与lsof对比

对比项 fuser lsof
定位方式 通过文件查找进程 通过进程查找文件
所属标准 POSIX -
参数类型 文件/网络端口 文件/PID/网络端口
进程输出 PID PID详细信息
是否可发送信息 可以,使用-k 不可以

ps

    在Windows系统中用于查看进程通常是通过任务管理器。而在Linux中,我们用ps(Process Status)命令来查看进程。

基本用法

ps [选项]

其常用选项如下所示:

选项 说明
-A 显示所有进程,同选项-e
-a 显示所有进程,但排除新会话的首进程和无控制终端的进程
-d 显示所有进程,但排除新会话的首进程
-e 显示所有进程,同选项-A
r 仅显示正在运行的进程
-C cmdlist 显示指定命令的进程信息
-p pidlist 显示指定PID的进程
-t ttylist 显示指定tty的进程
-u userlist 显示指定有效用户ID或名字的进程
-c 显示CLS和PRI列
-f 添加详细列信息,通常与其他选项联合使用
-x 没有关联到终端上的进程也进行显示
-o 仅显示自定义的列
-l 仅显示属于当前登录用户的PID与相关信息列表
--sort spec 对输出信息进行排序 + 升序排序 - 降序排序

用法示例

1、不带参数的示例

[root@localhost ~]# ps
  PID TTY          TIME CMD
11047 pts/0    00:00:00 ps
24892 pts/0    00:00:00 su
25142 pts/0    00:00:00 bash

2、仅显示与当前用户相关的进程和相关信息

[root@localhost ~]# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 R     0 22720 25142  0  80   0 - 38292 -      pts/0    00:00:00 ps
4 S     0 24892 22641  0  80   0 - 58599 do_wai pts/0    00:00:00 su
4 S     0 25142 24892  0  80   0 - 29305 do_wai pts/0    00:00:00 bash

3、查看系统所有进程

[root@localhost ~]# ps aux
USER PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root   2  0.0  0.0      0     0 ?        S    8月08   0:00 [kthreadd]
root   3  0.0  0.0      0     0 ?        S    8月08   0:03 [ksoftirqd/0]
root   5  0.0  0.0      0     0 ?        S<   8月08   0:00 [kworker/0:0H]
root   8  0.0  0.0      0     0 ?        S    8月08   0:00 [migration/0]

在Linux中ps通常有三种不同的书写格式

因此ps aux 和ps -aux 在显示的输出信息是一样的。

4、显示自定义列

[root@localhost ~]# ps -eo pid,user,cmd
PID USER     CMD
  2 root     [kthreadd]
  3 root     [ksoftirqd/0]
  5 root     [kworker/0:0H]
  8 root     [migration/0]

5、对输出结果进行排序

[root@localhost ~]# ps -ef --sort=uid,-ppid,+pid
UID  PID    PPID  C STIME TTY        TIME CMD
root 31637 31624  0 17:42 pts/1  00:00:00 less -s
root 40772 25142  0 17:44 pts/0  00:00:00 ps -ef --sort=uid,-ppid,+pid
root 40773 25142  0 17:44 pts/0  00:00:00 more
root 25142 24892  0 15:32 pts/0  00:00:00 bash
root 31624 24164  0 17:42 pts/1  00:00:00 man ps
root 24164 23955  0 15:32 pts/1  00:00:00 bash
root 23955 23586  0 15:32 pts/1  00:00:00 su root
root 24892 22641  0 15:32 pts/0  00:00:00 su root

pstree

    在使用ps查看进程十分方便,但若想查看详细进程和子进程时,则需要使用pstree全命令。由于pstree不是系统自带,需要自行安装

yum -y install pstree

基本语法

pstree [选项]

常用选项如下所示:

选项 说明
-a 显示每个进程的完整指令,包括路径、参数等
-h 高亮显示当前进程及父进程
-g 显示PGID
-n 相同父进程下,按各自的PID进行排序
-p 显示PID
-s 显示父进程
-u username 显示UID信息

kill

    在Windows系统中,当某个一个程序出现假死或无反应时,我们常常打开任务管理器,找到对应的进程,然后杀掉该进程。在命令行盛行的Linux中,我们该使用哪个命令?常用于杀掉进程的命令非kill莫属了。

基本用法

kill [选项] [PID]

其常用选项如下所示:

选项 说明
-s signal 向目标进程发送指定的信号类型,信号可以为名称或数字
-l 显示信号名称列表,如果在-l加编号则查看信号名称,反之亦然
-a 处理当前进程时,不限制命令和PID的对应关系
-p 指定kill命令仅显示相关进程的进程号,而不发送任何信号

用法示例

1、显示信号列表


02信号列表.jpg

除以上显示信号,还有一个特殊的编号0为测试信号,其作用如下:

[root@localhost ~]# kill -l 0
T
[root@localhost ~]# kill -0 99999
bash: kill: (99999) - 没有那个进程
[admin@localhost ~]# kill -0 2325
bash: kill: (2325) - 操作不被允许

2、查看信号对应的编号或名称

[root@localhost ~]# kill -l SIGHUP
1
[root@localhost ~]# kill -l KILL
9
[root@localhost ~]# kill -l 9
KILL

在Linux中常用信号如下所示:

信号名称 编号 解释
HUP 1 终端断线
INT 2 中断(同Ctrl+C)
QUIT 3 退出(同Ctrl+\)
KILL 9 强制终止
TEEM 15 终止
CONT 18 继续(与STOP相反)
STOP 19 暂停(同Ctrl+Z)

3、强制终止进程

[root@localhost ~]# kill -9 26744
[root@localhost ~]# kill -kill 30470

在使用kill -9需要注意的事项如下所示:

本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:

MyQRCode.jpg
上一篇 下一篇

猜你喜欢

热点阅读