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。用于查看进程打开的文件、目录和套接字等信息。
基本用法
lsof [选项] [文件名]
其常用选项参数如下所示:
选项 | 说明 |
---|---|
-?或-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输出的详细信息解释如下:
- COMMAND:进程名称,如果名称较长,则默认只显示前9个字符
- PID:进程标识符,如果添加-R参数,则显示父进程PPID
- USER:进程所有者,如果添加-g参数,则显示组标识符PGID
- FD:文件描述符
- TYPE:文件类型,常见类型如下所示:
DIR:表示目录
REG:表示普通文件
CHR:表示字符类型
BLK:表示块设备类型
UNIX:表示UNIX套接字
FIFO:表示先进先出队列
IPv4:表示IPv4套接字
IPv6:表示IPv6套接字
文件描述符FD,但却可以表示两类内容:
- 第一类是文件描述符
0:标准输入
1:标准输出
2:标准错误输出
n:其他文件描述符的数值
- 第二类描述文件特征的标识
CWD:表示应用程序的当前工作目录,即程序启动的目录
txt:表示文件类型为程序代码或数据
mem:内存映射文件
pd:父目录
rtd:根目录
DEL:表示文件已经删除但还存在于内存中
用法示例
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,在默认模式中,每个文件名后面会用一个字母表示访问类型,如下所示:
- c:表示当前目录
- e:表示该文件为可执行文件
- f:表示被打开的文件,默认模式中f不显示
- F:表示被打开的文件,用于写入操作,默认模式中F不显示
- r:根目录
- m:映射文件或共享lib
-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
- F:表示进程标志,说明当前进程的权限,若为4表示进程权限为root,若为1表示些子进程仅可进行复制(fork)而无法实际运行
- S:表示进程状态,主要状态有:
R:进程正在运行
S:进程处于睡眠状态,但可以被唤醒
D:进程处于不可被唤醒的睡眠状态,通常该进程可能在等待I/O
T:停止状态,可能是在工作控制或除错状态
Z:僵尸状态,进行已经终止但却无法释放内存等 - UID/PID/PPID:进行的所属UID/PID/PPID
- C:CPU使用率,单位为%
- PRI/NI:Priority/Nice缩写,表示进程被CPU执行的优先级,数值越小越快被CPU执行
- ADDR:与内存相关,ADDR表示该进程在内存的哪个部分,如果是Running进程,会显示 -
- SZ:与内存相关,表示该进程使用了多少内存;
- WCHAN:与内存相关,表示该进程目前是否正在运行,-表示正在运行中
- TTY:启动进程的终端名称
- TIME:进程的实际CPU占用时间之和,单位为秒
- CMD:进程命令
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]
- USER:进程所属用户
- PID:进程标识符
- %CPU:进程的CPU占比
- %MEM:进程物理内存占比
- VSZ:进程虚拟内存(KB)使用量
- RSS:进程占用的固定内存量(KB)
- TTY:启动进程的终端名称
- STAT:进程状态
- START:进程启动时间
- TIME:进程的实际CPU占用时间之和
- COMMAND:进程命令
在Linux中ps通常有三种不同的书写格式
- BSD格式:选项前不加短横线 - ,多个选项可以组合使用如ps aux
- UNIX格式:选项前加短横线 -,多个选项可以组合使用如ps -aux
- GNU长格式:选项前加双短横线 --,如 ps --context
因此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命令仅显示相关进程的进程号,而不发送任何信号 |
- 无选项:表示向目标进程发送默认的终止信号,即SIGTERM
- PID>0:表示向目标进程发送信号,此处的PID可以是多个PID,用空格进行分隔
- PID=0:表示向当前进程组的所有进程发送信号
- PID=-1:表示向除当前 kill 进程和 init 进程之外的所有进程发送信号
- PID<-1:表示向进程组PGID的所有进程发送信号,如-123,则向进程组PGID为123的所有进程发送信号
用法示例
1、显示信号列表
除以上显示信号,还有一个特殊的编号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需要注意的事项如下所示:
- kill不能杀死进程为1的init进程
- 在使用kill -9时是强行终止进程且没有通知目标进程进行自我清理,而是突然被中止,可以造成资源无法正常释放,数据无法同步到磁盘等,在使用前需要三思