【Linux系统】常用命令:进程与网络
现如今各种场合都有使用各种 Linux 发行版,从嵌入式设备到超级计算机,并且在服务器领域确定了地位,对于一个开发人员来说,Linux的学习是必不可少的,对于简单操作Linux系统更是必备的技能,对于Linux系统的重要性在这里不多赘述。于是我在学习过程中,整理了一系列Linux常用命令,文章内容收集整理于网络,相关代码都是经过自己实现验证的,众所周知,Linux系统的相关命令是数不胜数的,学完以至于完全记住是很难的,在这里只是整理一部分常用、实用、后端开发人员必备的命令,当然,个人感觉这些命令不需要刻意去记忆,而是在反复的使用过程中达到孰能生巧的,所以本系列文章目的主要用于方便自己后期的查阅与复习,希望可以帮助到你!
前面主要学习了Linux系统的文本操作的进阶命令、重定向、管道、流、文件打包解压缩等相关命令。详情查阅:【Linux系统】常用命令:文本操作、重定向、管道、流、文件打包解压缩 - 编程那点事儿 (imyjs.cn)
下面学习Linux系统中进程
相关与网络
相关命令的相关知识。
1.进程相关
一般来说程序分为两类,一种是系统程序,一种是应用程序。一个运行中的程序,就可以说是一个进程,进程是占用内存空间的,而当你杀掉进程时,资源也会随之释放。
有关操作系统进程的相关内容看这里:操作系统 (imyjs.cn)
进程类型
用户进程
:用户自己的程序,用户可以控制他的开启和关闭。交互进程
: 与用户进行交互操作的进程。批处理进程
:是一个进程集合,按顺序启动其他进程。守护进程
:一直运行的进程.crond。
进程状态
主要是切换进程的状态。我们先了解下 Linux
下进程的五种状态:
- 状态码
R
:表示正在运行的状态; - 状态码
S
:表示中断(休眠中,受阻,当某个条件形成后或接受到信号时,则脱离该状态); - 状态码
D
:表示不可中断(进程不响应系统异步信号,即使用kill命令也不能使其中断); - 状态码
Z
:表示僵死(进程已终止,但进程描述符依然存在,直到父进程调用wait4()
系统函数后将进程释放); - 状态码
T
:表示停止(进程收到SIGSTOP
、SIGSTP
、SIGTIN
、SIGTOU
等停止信号后停止运行)。
进程属性
- 进程ID : (pid) 唯一的数字标示,区分不同的进程。
- 进程有父进程和子进程。
- 启动进程的用户ID(uid)和用户的属组。
- 进程状态。
- 进程的优先级: 取值范围(-20,19) ,
数值越小优先级越大
,默认为0。 - 进程链接的终端。
- 进程占用资源情况。
父子进程的关系
父进程终止时子进程一定终止,而子进程终止时父进程不一定终止。
进程管理工具
ps: 查看进程。
top: 可以查看进程的动态信息。
kill: 杀进程。
pstree: 查看进程树。
pgrep: 搜进程。
lsof: 查看进程打开的文件。
ps
静态
的显示当前进程的信息 。
命令: ps
语法: ps 参数
常用参数:
-a
显示所有用户的进程-r
显示运行中的进程-l
长格式输出-u
按用户名和启动时间的顺序来显示进程,列出此用户运行的进程-f
用树形格式来显示进程-x
显示没有控制终端的进程-ef
列出所有进程,标准格式显示进程unix风格-efH
以乔木状列举出所有进程-aux
通过CPU
和内存使用来过滤进程ps -aux | less
-aux --sort -pcpu
按CPU
使用降序排列,-aux --sort -pmem
表示按内存使用降序排列-axjf
以树形结构显示进程,ps -axjf
它和pstree
效果类似。
使用示例
[zhangsan@localhost ~]$ ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.6 128032 6644 ? Ss 10:54 0:01 /usr/lib
root 2 0.0 0.0 0 0 ? S 10:54 0:00 [kthread
root 4 0.0 0.0 0 0 ? S< 10:54 0:00 [kworker
root 6 0.0 0.0 0 0 ? S 10:54 0:00 [ksoftir
root 7 0.0 0.0 0 0 ? S 10:54 0:00 [migrati
# .........
属性解释
USER
: 进程的属主PID
:进程号,每个进程都有唯一的进程号%CPU
: 进程占cpu百分比%MEM
: 进程占内存的百分比VSZ
: 进程占用虚拟内存大小RSS
: 固定内存使用数量TTY
:进程运行所在的终端TIME
:进程运行时间、进程消耗CPU的时间CMD
:产生这个进程的程序名,如果在进程列表中看到有好几行都是同样的程序名,那么就是同样的程序产生了不止一个进程START
启动进程的时间STAT
: 进程状态- R 正在运行可中在队列中可过行的;
- S 处于休眠状态;
- Z 僵尸进程;
- T 停止或被追踪;
- N 优先级较低的进程;
- L 有些页被锁进内存;
- s 进程的领导者(在它之下有子进程)
总结:用于显示当前系统中的进程,
ps
命令显示的进程列表不会随时间而更新,是静态的,是运行ps
命令那个时刻的状态或者说是一个进程快照。
常用形式
ps -aux # BSD格式来显示进程
ps -ef # 标准格式显示进程unix风格
ps -aux --sort %cpu # 按照cpu从小到大排序
ps -aux --sort -%cpu # 按照cpu从大到小排序
top
与ps相反的是top命令可以查看进程的动态
信息。
使用示例
top - 13:19:58 up 2:25, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 113 total, 1 running, 112 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 995704 total, 512352 free, 207968 used, 275384 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 637600 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 128032 6644 4156 S 0.0 0.7 0:01.40 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.02 migration/0
# .........
Ctrl + C 结束查看。
属性解释
前五行是数据的整理统计信息。
第一行:
20:24:16
当前时间up 9:40
系统运行时间,格式为时:分3 user
当前登陆用户数量load average: 0.01, 0.03, 0.05
系统负载,任务队列平均长度 1分钟,5分钟,15分钟前到现在的平均值。
第二三行:
- 98 total
进程总数量
- 1 running
正在运行的进程数量
- 97 sleeping
睡眠的进程数量
- 0 stopped
停止的进程数量
- 0 zombie
僵尸进程数量
- %Cpu(s):
- 0.2 us 系统用户进程使用cpu百分比
- 0.0 sy 内核进程占用cpu百分比
- 0.0 ni 用户进程空间内改变过优先级的进程占用cpu百分比
- 99.8 id 空闲cpu百分比
- 0.0 wa 等待输入输出的cpu时间百分比
- 0.0 hi 硬件cpu中断占用百分比
- 0.0 si 软中断占用百分比
- 0.0 st 虚拟机占用百分比
第四五行:
Mem : (单位K)
- 995704 total
物理内存总量
- 530408 free
空闲内存总量
- 221260 used
使用的物理内存总量
- 244036 buff/cache
内核缓存的内存量
Swap: (单位K)
- 2097148 total
交换区总量
- 2097148 free
空闲交换区总量
- 0 used
使用的交换区总量
- 623812 avail Mem
可利用的内存量
标题行:
- PID: 进程id
- USER: 进程所有者用户名
- PR: 优先级
- NI: 进程优先级,nice值,负值 -> 高优先级,正值 -> 低优先级
- VIRT: 虚拟内存总量 virt=swap + res
- RES: 实际使用内存大小
- SHR: 共享内存大小
- S: 进程状态
d: 不可中断的睡眠状态
r: 运行
s: 睡眠
t: 跟踪
z: 僵尸进程
- %CPU: 上次更新到现在cpu时间占用百分比
- %MEM: 进程使用物理内存百分比
- TIME+: 进程使用cpu的时间总计,单位 1/100秒
- COMMAND: 命令行
kill
结束一个进程, kill + PID
。
常用参数:
- -l 列出所有信号名称
- -s 指定发送信号(默认)
- -u 指定用户
kill 956 # 结束进程号为956的进程
kill 956 957 # 结束多个进程
kill -9 7291 # 强制结束进程
kill -u lisi # 杀死指定用户的所有进程
前台进程 & 后台进程
默认情况下,用户创建的进程都是前台进程,前台进程从键盘读取数据,并把处理结果输出到显示器。例如运行
top
命令,这就是一个一直运行的前台进程。后台进程的优点是不必等待程序运行结束,就可以输入其它命令。
在需要执行的命令后面添加 &
符号,就表示启动一个后台进程。
&
启动后台进程,它的缺点是后台进程与终端相关联,一旦关闭终端,进程就自动结束了
。
cp name.csv name-copy.csv &
nohup
使进程不受挂断(关闭终端等动作)的影响。
nohup cp name.csv name-copy.csv
nohup
命令也可以和 &
结合使用。
nohup cp name.csv name-copy.csv &
bg
使一个“后台暂停运行”的进程,状态改为“后台运行”。
bg %1 # 不加任何参数的情况下,bg命令会默认作用于最近的一个后台进程,如果添加参数则会作用于指定标号的进程
实际案例1:
1. 执行 grep -r "log" / > grep_log 2>&1 命令启动一个前台进程,并且忘记添加 & 符号
2. ctrl + z 使进程状态转为后台暂停
3. 执行 bg 将命令转为后台运行
实际案例2:
前端开发时我们经常会执行 yarn start 启动项目
此时我们执行 ctrl + z 先使其暂停
然后执行 bg 使其转为后台运行
这样当前终端就空闲出来可以干其它事情了,如果想要唤醒它就使用 fg 命令即可(后面会讲)
jobs
显示当前终端后台进程状态。
[root@lion ~]# jobs
[1]+ Stopped top
[2]- Running grep --color=auto -r "log" / > grep_log 2>&1 &
fg
fg
使进程转为前台运行,用法和 bg
命令类似。
我们可以使程序在后台运行,成为后台进程,这样在当前终端中我们就可以做其他事情了,而不必等待此进程运行结束。
守护进程
一个运行起来的程序被称为进程。在 Linux
中有些进程是特殊的,它不与任何进程关联,不论用户的身份如何,都在后台运行,这些进程的父进程是 PID
为1的进程, PID
为1的进程只在系统关闭时才会被销毁。它们会在后台一直运行等待分配工作。我们将这类进程称之为守护进程 daemon
。
守护进程的名字通常会在最后有一个 d
,表示 daemon
守护的意思,例如 systemd
、httpd
。
2.网络相关
ip
Linux ip
命令与ifconfig
命令类似,但比 ifconfig 命令更加强大,主要功能是用于显示或设置网络设备。
ip 命令是 Linux 加强版的的网络配置工具,用于代替 ifconfig 命令。
语法
ip [ OPTIONS ] OBJECT { COMMAND | help }
OBJECT 为常用对象,值可以是以下几种:
OBJECT={ link | addr | addrlabel | route | rule | neigh | ntable | tunnel | maddr | mroute | mrule | monitor | xfrm | token }
常用对象的取值含义如下:
link
:网络设备address
:设备上的协议(IP或IPv6)地址addrlabel
:协议地址选择的标签配置route
:路由表条目rule
:路由策略数据库中的规则
OPTIONS 为常用选项,值可以是以下几种:
OPTIONS={ -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] | -h[uman-readable] | -iec | -f[amily] { inet | inet6 | ipx | dnet | link } | -o[neline] | -t[imestamp] | -b[atch] [filename] | -rc[vbuf] [size] }
常用选项的取值含义如下:
-V
:显示命令的版本信息;-s
:输出更详细的信息;-f
:强制使用指定的协议族;-4
:指定使用的网络层协议是IPv4协议;-6
:指定使用的网络层协议是IPv6协议;-0
:输出信息每条记录输出一行,即使内容较多也不换行显示;-r
:显示主机时,不使用IP地址,而使用主机的域名。help
为该命令的帮助信息。
操作
ip link show # 显示网络接口信息
ip link set eth0 up # 开启网卡
ip link set eth0 down # 关闭网卡
ip link set eth0 promisc on # 开启网卡的混合模式
ip link set eth0 promisc offi # 关闭网卡的混个模式
ip link set eth0 txqueuelen 1200 # 设置网卡队列长度
ip link set eth0 mtu 1400 # 设置网卡最大传输单元
ip addr show # 显示网卡IP信息
ip addr add 192.168.0.1/24 dev eth0 # 设置eth0网卡IP地址192.168.0.1
ip addr del 192.168.0.1/24 dev eth0 # 删除eth0网卡IP地址
ip route show # 显示系统路由
ip route add default via 192.168.1.254 # 设置系统默认路由
ip route list # 查看路由信息
ip route add 192.168.4.0/24 via 192.168.0.254 dev eth0 # 设置192.168.4.0网段的网关为192.168.0.254,数据走eth0接口
ip route add default via 192.168.0.254 dev eth0 # 设置默认网关为192.168.0.254
ip route del 192.168.4.0/24 # 删除192.168.4.0网段的网关
ip route del default # 删除默认路由
ip route delete 192.168.1.0/24 dev eth0 # 删除路由
ifconfig
查看 ip
网络相关信息,用于显示或设置网络设备。可设置网络设备的状态,或是显示目前的设置。
如果命令不存在的话, 执行命令 yum install net-tools
安装。
如果提示报错
“Could not resolve host: mirrorlist.centos.org; Unknown error”
看这里:“Could not resolve host: mirrorlist.centos.org; Unknown error”解决方法 - 编程那点事儿 (imyjs.cn)
参数说明:
- add<地址> 设置网络设备IPv6的IP地址。
- del<地址> 删除网络设备IPv6的IP地址。
- down 关闭指定的网络设备。
- <hw<网络设备类型><硬件地址> 设置网络设备的类型与硬件地址。
- io_addr<I/O地址> 设置网络设备的I/O地址。
- irq<IRQ地址> 设置网络设备的IRQ。
- media<网络媒介类型> 设置网络设备的媒介类型。
- mem_start<内存地址> 设置网络设备在主内存所占用的起始地址。
- metric<数目> 指定在计算数据包的转送次数时,所要加上的数目。
- mtu<字节> 设置网络设备的MTU。
- netmask<子网掩码> 设置网络设备的子网掩码。
- tunnel<地址> 建立IPv4与IPv6之间的隧道通信地址。
- up 启动指定的网络设备。
- -broadcast<地址> 将要送往指定地址的数据包当成广播数据包来处理。
- -pointopoint<地址> 与指定地址的网络设备建立直接连线,此模式具有保密功能。
- -promisc 关闭或启动指定网络设备的promiscuous模式。
- [IP地址] 指定网络设备的IP地址。
- [网络设备] 指定网络设备的名称。
使用示例
[zhangsan@localhost ~]$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.149.129 netmask 255.255.255.0 broadcast 192.168.149.255
inet6 fe80::5e2:18ef:9603:c4f8 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:39:e7:e1 txqueuelen 1000 (Ethernet)
RX packets 2624 bytes 205379 (200.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1625 bytes 160830 (157.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[zhangsan@localhost ~]$
参数解析
ens33
网卡名称flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
- UP:表示“接口已启用”。
- BROADCAST :表示“主机支持广播”。
- RUNNING:表示“接口在工作中”。
- MULTICAST:表示“主机支持多播”。
- MTU:1500(最大传输单元):1500字节
inet 192.168.149.129 netmask 255.255.255.0 broadcast 192.168.149.255
- inet :网卡的IP地址。
- netmask :网络掩码。
- broadcast :广播地址。
inet6 fe80::5e2:18ef:9603:c4f8 prefixlen 64 scopeid 0x20<link>
- 网卡的IPv6地址
ether 00:0c:29:39:e7:e1 txqueuelen 1000 (Ethernet)
- 连接类型:Ethernet (以太网) HWaddr (硬件mac地址)
- txqueuelen (网卡设置的传送队列长度)
RX packets 2624 bytes 205379 (200.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
- RX packets 接收时,正确的数据包数。
- RX bytes 接收的数据量。
- RX errors 接收时,产生错误的数据包数。
- RX dropped 接收时,丢弃的数据包数。
- RX overruns 接收时,由于速度过快而丢失的数据包数。
- RX frame 接收时,发生frame错误而丢失的数据包数。
TX packets 1625 bytes 160830 (157.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- TX packets 发送时,正确的数据包数。
- TX bytes 发送的数据量。
- TX errors 发送时,产生错误的数据包数。
- TX dropped 发送时,丢弃的数据包数。
- TX overruns 发送时,由于速度过快而丢失的数据包数。
- TX carrier 发送时,发生carrier错误而丢失的数据包数。
- collisions 冲突信息包的数目。
lo
表示本地回环(Local Loopback
的缩写,对应一个虚拟网卡)可以看到它的ip
地址是127.0.0.1
。每台电脑都应该有这个接口,因为它对应着“连向自己的链接”。这也是被称之为“本地回环”的原因。所有经由这个接口发送的东西都会回到你自己的电脑。看起来好像并没有什么用,但有时为了某些缘故,我们需要连接自己。例如用来测试一个网络程序,但又不想让局域网或外网的用户查看,只能在此台主机上运行和查看所有的网络接口。例如在我们启动一个前端工程时,在浏览器输入127.0.0.1:3000
启动项目就能查看到自己的web
网站,并且它只有你能看到。wlan0
表示无线局域网(上面案例并未展示)。
host
ip
地址和主机名的互相转换。
[zhangsan@localhost ~]$ host
-bash: host: 未找到命令
[zhangsan@localhost ~]$
软件安装
yum install bind-utils
需要root权限!
基础用法
[zhangsan@localhost ~]$ host www.imyjs.cn
www.imyjs.cn has address 36.248.208.245
Host www.imyjs.cn not found: 3(NXDOMAIN)
Host www.imyjs.cn not found: 3(NXDOMAIN)
[zhangsan@localhost ~]$ host 13.229.188.59
59.188.229.13.in-addr.arpa domain name pointer ec2-13-229-188-59.ap-southeast-1.compute.amazonaws.com.
ssh 连接远程服务器
通过非对称加密以及对称加密的方式(同 HTTPS
安全连接原理相似)连接到远端服务器。
ssh 用户@ip:port
1、ssh root@172.20.10.1:22 # 端口号可以省略不写,默认是22端口
2、输入连接密码后就可以操作远端服务器了
配置 ssh
config
文件可以配置 ssh
,方便批量管理多个 ssh
连接。
配置文件分为以下几种:
- 全局
ssh
服务端的配置:/etc/ssh/sshd_config
; - 全局
ssh
客户端的配置:/etc/ssh/ssh_config
(很少修改); - 当前用户
ssh
客户端的配置:~/.ssh/config
。
【服务端 config
文件的常用配置参数】
服务端 config 参数 | 作用 |
---|---|
Port | sshd 服务端口号(默认是22) |
PermitRootLogin | 是否允许以 root 用户身份登录(默认是可以) |
PasswordAuthentication | 是否允许密码验证登录(默认是可以) |
PubkeyAuthentication | 是否允许公钥验证登录(默认是可以) |
PermitEmptyPasswords | 是否允许空密码登录(不安全,默认不可以) |
[注意] 修改完服务端配置文件需要重启服务
systemctl restart sshd
【客户端 config
文件的常用配置参数】
客户端 config 参数 | 作用 |
---|---|
Host | 别名 |
HostName | 远程主机名(或 IP 地址) |
Port | 连接到远程主机的端口 |
User | 用户名 |
配置当前用户的 config
:
# 创建config
vim ~/.ssh/config
# 填写一下内容
Host lion # 别名
HostName 172.x.x.x # ip 地址
Port 22 # 端口
User root # 用户
这样配置完成后,下次登录时,可以这样登录 ssh lion
会自动识别为 root
用户。
[注意] 这段配置不是在服务器上,而是你自己的机器上,它仅仅是设置了一个别名。
免密登录
ssh
登录分两种,一种是基于口令(账号密码),另外一种是基于密钥的方式。
基于口令,就是每次登录输入账号和密码,显然这样做是比较麻烦的,今天主要学习如何基于密钥实现免密登录。
基于密钥验证原理
客户机生成密钥对(公钥和私钥),把公钥上传到服务器,每次登录会与服务器的公钥进行比较,这种验证登录的方法更加安全,也被称为“公钥验证登录”。
具体实现步骤
1、在客户机中生成密钥对(公钥和私钥) ssh-keygen
(默认使用 RSA 非对称加密算法)
运行完 ssh-keygen
会在 ~/.ssh/
目录下,生成两个文件:
id_rsa.pub
:公钥id_rsa
:私钥
2、把客户机的公钥传送到服务
执行 ssh-copy-id root@172.x.x.x
(ssh-copy-id
它会把客户机的公钥追加到服务器 ~/.ssh/authorized_keys
的文件中)。
执行完成后,运行 ssh root@172.x.x.x
就可以实现免密登录服务器了。
配合上面设置好的别名,直接执行 ssh lion
就可以登录,是不是非常方便。
wget
可以使我们直接从终端控制台下载文件,只需要给出文件的HTTP或FTP地址。
wget [参数][URL地址]
wget http://www.minjieren.com/wordpress-3.1-zh_CN.zip
wget
非常稳定,如果是由于网络原因下载失败, wget
会不断尝试,直到整个文件下载完毕。
常用参数
-c
继续中断的下载。
备份
scp
它是 Secure Copy
的缩写,表示安全拷贝。 scp
可以使我们通过网络,把文件从一台电脑拷贝到另一台电脑。
scp
是基于 ssh
的原理来运作的, ssh
会在两台通过网络连接的电脑之间创建一条安全通信的管道, scp
就利用这条管道安全地拷贝文件。
scp source_file destination_file # source_file 表示源文件,destination_file 表示目标文件
其中 source_file
和 destination_file
都可以这样表示: user@ip:file_name
, user
是登录名, ip
是域名或 ip
地址。 file_name
是文件路径。
scp file.txt root@192.168.1.5:/root # 表示把我的电脑中当前文件夹下的 file.txt 文件拷贝到远程电脑
scp root@192.168.1.5:/root/file.txt file.txt # 表示把远程电脑上的 file.txt 文件拷贝到本机
rsync
rsync
命令主要用于远程同步文件。它可以同步两个目录,不管它们是否处于同一台电脑。它应该是最常用于“增量备份”的命令了。它就是智能版的 scp
命令。
软件安装
yum install rsync
基础用法
rsync -arv Images/ backups/ # 将Images 目录下的所有文件备份到 backups 目录下
rsync -arv Images/ root@192.x.x.x:backups/ # 同步到服务器的backups目录下
常用参数
-a
保留文件的所有信息,包括权限,修改日期等;-r
递归调用,表示子目录的所有文件也都包括;-v
冗余模式,输出详细操作信息。
默认地, rsync
在同步时并不会删除目标目录的文件,例如你在源目录中删除一个文件,但是用 rsync
同步时,它并不会删除同步目录中的相同文件。如果向删除也可以这么做: rsync -arv --delete Images/ backups/
。