2 - Linux 文件和目录
文件基本概念
在 Linux 系统中,一切皆文件 。无论是文本、图像、设备还是进程间的通信通道,都以文件的形式存在和管理。Linux 文件采用树形目录结构,以根目录 "/" 为起点,所有文件和目录都挂载在这个树形结构中,形成一个完整的文件系统。
文件类型
Linux 文件主要分为以下几种类型,可通过 ls -l 命令查看文件类型,命令输出的第一个字符代表文件类型:
-
普通文件(-):最常见的文件类型,包括文本文件、二进制文件、脚本文件等。例如,test.txt 是文本文件,a.out 是编译后的二进制文件。
-
目录文件(d):用于存放其他文件和目录,类似 Windows 中的文件夹。如 /home 目录通常存放用户的个人文件。
-
链接文件(l):分为硬链接和软链接(符号链接)。软链接类似于 Windows 的快捷方式,指向另一个文件;硬链接则是文件的另一个入口,与原文件共享相同的 inode。
-
设备文件(b/c):与硬件设备相关,b 表示块设备(如硬盘、U 盘),c 表示字符设备(如键盘、鼠标),通常存放在 /dev 目录下。
-
管道文件(p):用于进程间通信,是一种临时的文件类型。
-
套接字文件(s):用于网络通信,支持不同进程之间的数据交互,常见于 /var/run 目录。
bash
ll | grep '^s' #查找当前目录下的套接字文件
Linux 系统目录结构
- /(根目录):整个文件系统的起点,所有目录和文件都包含在根目录下。
- /bin:存放系统必备的二进制可执行文件,如 ls、cp、mv 等基本命令,普通用户也可执行。
- /sbin:存放系统管理的二进制可执行文件,如 reboot、shutdown 等,通常需要 root 权限才能执行。
- /home:普通用户的主目录存放位置,每个用户在该目录下有一个以用户名命名的子目录,用于存放用户的个人文件和设置。
- /root:root 用户的主目录,与普通用户的主目录不同,它直接位于根目录下。
- /etc:存放系统配置文件,如网络配置文件 network/interfaces、用户配置文件 passwd 等。
- /usr:存放系统应用程序和文件,类似于 Windows 的 Program Files 目录,其中 /usr/bin 存放用户常用命令,/usr/lib 存放程序运行所需的库文件。
- /var:存放经常变化的文件,如日志文件(/var/log)、邮件(/var/mail)、缓存文件等。
- /tmp:存放临时文件,系统重启后该目录下的文件会被清空。
- /dev:存放设备文件,如硬盘 sda、光驱 sr0 等。
- /proc:虚拟文件系统,存放系统进程和内核状态的信息,这些文件并不实际存储在硬盘上,而是由内核动态生成,如 /proc/cpuinfo 包含 CPU 信息。
浏览、切换、目录大小
目录创建
mkdir
命令创建目录 :
bash
mkdir test #创建目录
mkdir -r test/level1/level2 #递归创建目录
浏览
ls (list) 列出目录内容:
bash
ls -l # 长格式显示文件和目录详细信息
ls -a # 显示所有文件(包括隐藏文件)
ls -lh # 以人类可读的方式显示文件大小
ls -lt # 按修改时间排序显示
ls -R # 递归显示子目录内容
tree:以树状结构显示目录
bash
tree # 显示当前目录的树状结构
tree -L 2 # 只显示两级目录结构
tree -a | tail -1 #只显示统计信息
切换
cd:切换目录
bash
cd /path/to/directory # 切换到指定目录
cd .. # 返回上级目录
cd - # 返回上次所在目录
cd # 回到用户主目录
pwd:显示当前工作目录
bash
pwd # 打印当前所在目录的完整路径
查看目录大小
du:估算文件空间使用情况
bash
du -sh /path/to/directory # 显示目录总大小(-s:汇总,-h:人类可读)
du -h --max-depth=1 # 显示当前目录下一级子目录的大小
df:显示文件系统磁盘空间使用情况
bash
df -h # 以人类可读的方式显示所有文件系统的使用情况
df -h / # 显示根目录所在文件系统的使用情况
文件创建、删除、详细信息
文件创建
touch:创建空白文件,还能更新已有文件的时间戳。
bash
touch newfile.txt # 创建一个名为newfile.txt的空白文件
touch file1 file2 # 同时创建多个文件
cat > : 创建文件并输入内容,按 Ctrl + D
结束输入。
特点:若文件已存在,会覆盖原有内容;适合快速写入少量文本。
bash
# 创建file.txt并输入两行内容
cat > file.txt
Hello, Linux!
This is a test file.
^D # 按Ctrl+D保存退出
**echo > 或 echo >>:**创建文件并写入单行内容。
echo "内容" > 文件名:覆盖写入(文件不存在则创建)。 echo "内容" >> 文件名:追加写入(文件不存在则创建)。
bash
# 覆盖写入(创建新文件)
echo "Server started at 9:00" > status.log
# 追加写入(文件存在则添加内容)
echo "Error: connection failed" >> status.log
vim 编辑器:创建并编辑文件。通过文本编辑器创建文件,适合编写复杂内容(需先安装编辑器)。
bash
# 用vim创建并编辑file.txt(按i进入编辑模式,Esc+`:wq`保存退出)
vim file.txt
# 用nano创建并编辑note.txt(更简单的编辑器,Ctrl+O保存,Ctrl+X退出)
nano note.txt
文件删除
rm(remove)命令用于删除文件或目录,删除后无法恢复,使用时需格外谨慎。
bash
# 复制文件到目标目录
cp memo.txt ~/backup/ # 把memo.txt复制到backup目录
# 复制文件并重命名(目标是新文件名)
cp data.csv data_backup.csv # 复制data.csv为data_backup.csv
# 复制目录(必须加-r)
cp -r src/ dest/ # 递归复制src目录到dest目录(dest不存在则创建)
# 复制目录时保留属性(如权限、时间)
cp -a project/ project_backup/ # 适合备份目录,保留所有原始属性
# 批量复制文件(通配符)
cp *.jpg ~/images/ # 复制所有.jpg文件到images目录
# 复制前提示覆盖
cp -i old.txt new.txt # 若new.txt已存在,提示"是否覆盖?"
# 显示复制过程
cp -v document.pdf ~/docs/ # 输出:'document.pdf' -> '/home/user/docs/document.pdf'
详细信息
bash
stat filename.log
文件移动、复制
文件移动 ( 剪切 / 重命名 )
mv(move)命令用于移动文件 / 目录,也可实现重命名,是 Linux 中最常用的命令之一。
-i
:若目标文件已存在,移动前提示确认(避免误覆盖)。-f
:强制移动,覆盖目标文件时不提示(慎用)。-v
:显示移动过程的详细信息(verbose)。
bash
# 移动文件到目标目录(目标目录必须存在)
mv document.txt ~/Documents/ # 把document.txt移动到用户的Documents目录
# 重命名文件(源和目标在同一目录)
mv old_name.jpg new_name.jpg
# 移动目录(无需递归参数,mv默认支持目录移动)
mv project/ ~/workspace/ # 把project目录移动到workspace目录
# 批量移动同类型文件(用通配符*)
mv *.txt ~/text_files/ # 把当前目录所有.txt文件移动到text_files目录
# 移动时提示覆盖(安全操作)
mv -i report.pdf ~/backup/ # 若backup目录已有report.pdf,会提示是否覆盖
# 显示移动过程
mv -v image.png photos/ # 输出:'image.png' -> 'photos/image.png'
文件复制
cp(copy)命令用于复制文件或目录,需注意复制目录时的递归参数。
-r
或-R
:递归复制目录(必须加,否则无法复制目录)。-i
:覆盖目标文件前提示确认。-f
:强制复制,覆盖时不提示。-v
:显示复制过程的详细信息。-p
:保留源文件的权限、时间戳等属性。-a
:归档复制(相当于-dR --preserve=all
,保留所有属性,适合备份)。
bash
# 复制文件到目标目录
cp memo.txt ~/backup/ # 把memo.txt复制到backup目录
# 复制文件并重命名(目标是新文件名)
cp data.csv data_backup.csv # 复制data.csv为data_backup.csv
# 复制目录(必须加-r)
cp -r src/ dest/ # 递归复制src目录到dest目录(dest不存在则创建)
# 复制目录时保留属性(如权限、时间)
cp -a project/ project_backup/ # 适合备份目录,保留所有原始属性
# 批量复制文件(通配符)
cp *.jpg ~/images/ # 复制所有.jpg文件到images目录
# 复制前提示覆盖
cp -i old.txt new.txt # 若new.txt已存在,提示"是否覆盖?"
# 显示复制过程
cp -v document.pdf ~/docs/ # 输出:'document.pdf' -> '/home/user/docs/document.pdf'
3 - Linux 用户、用户组、文件权限、文件查找
在 Linux 操作系统中,用户与权限管理是系统安全和稳定运行的核心环节。Linux 是典型的多用户操作系统,每个使用系统的人都需要拥有独立的用户账户,系统通过用户 ID(UID)来唯一标识不同用户。
用户分类
-
超级用户(root):UID 固定为 0,拥有系统的最高权限,可执行任何操作,包括修改系统核心配置、删除关键文件等。在日常操作中应尽量避免使用 root 账户,以降低误操作风险。
-
系统用户:通常 UID 范围在 1-999(不同 Linux 发行版可能略有差异),这类用户并非为实际操作人员创建,而是用于运行系统服务(如 Apache、MySQL 等)。系统用户一般没有登录权限,其存在是为了保证服务运行的独立性和安全性。
-
普通用户:UID 从 1000 开始,由管理员创建,用于日常工作。普通用户的权限受到严格限制,仅能在授权范围内操作文件和执行命令。
用户
1. 创建普通用户
创建普通用户使用useradd命令,默认会分配 1000 及以上的 UID,同时创建对应的家目录和默认 shell。
-
-m:自动创建用户的家目录(/home/stark),如果不添加此参数,家目录不会自动创建。
-
-s /bin/bash:指定用户的默认 shell 为 bash,允许用户登录系统后使用 bash 交互环境。
bash
useradd [选项] 用户名
# 示例 1:创建用户并自动创建家目录
useradd -m newuser # 创建 newuser 并生成 /home/newuser
# 示例 2:指定家目录和 shell
useradd -m -d /data/user1 -s /bin/bash user1 # 家目录为 /data/user1,shell 为 bash
# 示例 3:指定初始组和附加组
useradd -m -g developers -G sudo,adm user2 # 初始组为 developers,附加组为 sudo 和 adm
#查看系统中有多少用户
cut -d: -f1 /etc/passwd
2、创建系统用户
系统用户主要用于运行服务,通常不需要登录权限,因此创建时会指定较小的 UID 范围,并设置不可登录的 shell。
示例:创建一个用于运行 nginx 服务的系统用户
bash
useradd -r -s /sbin/nologin -M nginx
-
-r:表示创建系统用户,UID 会自动分配在 1-999 范围内。
-
-s /sbin/nologin:指定默认 shell 为 nologin,禁止该用户登录系统,增强安全性。
-
-M:不自动创建家目录,因为系统用户一般不需要家目录来存储个人文件。
系统用户创建后无需设置密码(也可以设置,但通常没必要),其主要作用是在运行 "nginx" 服务时作为进程的所有者,限制服务进程的权限范围,避免服务被攻击后获得过高权限影响系统安全。
3. 设置用户密码
bash
passwd 用户名
# 示例:为用户设置密码(需输入两次)
passwd newuser # 交互设置 newuser 的密码
4. 删除用户
bash
userdel [选项] 用户名
# 示例 1:仅删除用户账户
userdel olduser # 保留 /home/olduser 目录
# 示例 2:彻底删除用户(推荐)
userdel -r olduser # 删除用户及家目录、邮件池
用户组
4.创建用户组
bash
groupadd [选项] 组名
# 示例 1:创建普通组
groupadd devops # 创建 devops 组
# 示例 2:创建系统组(GID < 1000)
groupadd -r systemd # 创建系统组 systemd
5. 删除用户组
bash
groupdel 组名
# 示例:删除空组
groupdel temp # 删除 temp 组(组内无用户时生效)
6. 修改用户所属组
bash
usermod -aG 组名 用户名
# 示例 1:添加用户到单个组
usermod -aG docker user1 # 将 user1 添加到 docker 组(用于容器权限)
# 示例 2:添加用户到多个组
usermod -aG sudo,wheel user2 # 赋予 user2 管理员权限(sudo 组)
7. 切换用户
bash
su - 用户名
# 示例 1:切换到 root 用户
su - root # 切换到 root 并加载环境变量
# 示例 2:临时执行命令(无需切换)
sudo -u user1 ls /data # 以 user1 身份执行 ls 命令
文件权限
1、Linux 是多用户多任务操作系统,为了区分不同用户对文件的操作权限,采用了用户 - 组 - 其他(User-Group-Others)的三元权限模型。
-
所有者(User):文件的创建者,拥有最高管理权限
-
所属组(Group):包含多个用户的集合,便于团队协作授权
-
其他用户(Others):系统中除所有者和所属组成员外的所有用户
2、每种身份可拥有三种基本权限,分别是:
-
读权限(r):允许查看文件内容或列出目录内容
-
写权限(w):允许修改文件内容或在目录中创建 / 删除文件
-
执行权限(x):允许运行可执行文件或进入目录
3、数字表示法用三位八进制数表示权限组合,每个权限对应固定数值:
-
读权限(r):4
-
写权限(w):2
-
执行权限(x):1
-
无权限:0
bash
# 设置权限为rwxr-xr-x(755):常用于可执行文件
chmod 755 app.py
# 设置权限为rw-r--r--(644):常用于普通文件
chmod 644 README.md
# 设置权限为rwx------(700):常用于私有目录
chmod 700 ~/private/
# 设置权限为rwxrwxrwx(777):所有用户都有全部权限(谨慎使用)
chmod 777 /tmp/shared/
4、chmod 和 chown
权限赋值的核心命令:chmod
bash
chmod [选项] 权限 文件/目录
# 设置权限为rwxr-xr-x(755):常用于可执行文件
chmod 755 app.py
# 设置权限为rw-r--r--(644):常用于普通文件
chmod 644 README.md
# 设置权限为rwx------(700):常用于私有目录
chmod 700 ~/private/
# 设置权限为rwxrwxrwx(777):所有用户都有全部权限(谨慎使用)
chmod 777 /tmp/shared/
修改文件的所有者和群组,这里有个chown
万能的命令,-R
参数非常有用,R是recursive的缩写,表示递归,用来设置子目录和子文件。
shell
chown -R stark:stark file.txt
文件查找
1. find
命令(全能搜索)
-name
:按文件名查找(支持通配符*
、?
)。-type
:按文件类型查找(f
= 普通文件,d
= 目录,l
= 符号链接)。-size
:按文件大小查找(+10M
= 大于 10MB,-50k
= 小于 50KB)。-mtime
:按修改时间查找(-2
=2 天内,+7
=7 天前)。-user
/-group
:按所有者 / 组查找。
bash
# 查找当前目录下所有名为 "example.txt" 的文件
find . -name "example.txt"
# 查找 /etc 目录下所有 .conf 后缀的文件(忽略大小写)
find /etc -iname "*.conf"
# 查找 /home 目录下大于100MB且修改时间在7天内的文件
find /home -size +100M -mtime -7
# 查找并删除30天前的临时文件
find /tmp -type f -mtime +30 -delete
#查找二进制目录命令
find / -type f -executable -name "nginx" 2>/dev/null
2. locate
命令(快速索引搜索)
- 基于系统预建的文件索引(由
updatedb
命令更新),速度极快。 - 适合查找已知文件名的文件,但可能不显示最新创建的文件。
bash
# 查找所有包含 "nginx" 的文件
locate nginx
# 使用通配符精确匹配
locate /usr/bin/python3 # 查找绝对路径
4 - Linux 文件压缩与解压
在 Linux 系统中,文件压缩与解压是日常操作的重要组成部分,常用工具包括tar、zip/unzip等,它们各自适用于不同场景,且功能可灵活组合。
tar 命令
bash
tar [选项] [文件或目录]
常用选项:
- -c:创建新的归档文件
- -x:从归档文件中提取文件
- -t:列出归档文件中的内容
- -z:通过 gzip 过滤归档文件(处理.gz 文件)
- -j:通过 bzip2 过滤归档文件(处理.bz2 文件)
- -v:显示操作的详细过程
- -f:指定归档文件的名称(必须放在最后一个选项)
- -C:指定提取文件的目标目录
- -p:保留文件的权限和属性
1、创建压缩包
bash
# 创建未压缩的tar包
tar -cvf archive.tar dir/
# 创建gzip压缩的tar包(.tar.gz或.tgz)
tar -czvf archive.tar.gz dir/
# 创建bzip2压缩的tar包(.tar.bz2)
tar -cjvf archive.tar.bz2 dir/
# 创建xz压缩的tar包(.tar.xz)
tar -cJvf archive.tar.xz dir/
2 、解压文件
bash
# 解压tar包到当前目录
tar -xvf archive.tar
# 解压tar.gz包到当前目录
tar -xzvf archive.tar.gz
# 解压tar.bz2包到当前目录
tar -xjvf archive.tar.bz2
# 解压tar.xz包到当前目录
tar -xJvf archive.tar.xz
# 解压到指定目录
tar -xzvf archive.tar.gz -C /path/to/extract/
3、查看压缩包内容
bash
# 查看tar包内容
tar -tvf archive.tar
# 查看tar.gz包内容
tar -tzvf archive.tar.gz
4、只压缩特定类型的文件
bash
# 只压缩目录下的所有jpg和png文件
tar -czvf images.tar.gz *.jpg *.png
5、排除特定文件或目录
bash
# 压缩时排除所有txt文件
tar -czvf backup.tar.gz --exclude='*.txt' /path/to/dir
# 排除目录
tar -czvf project.tar.gz --exclude='project/temp' project/
6、追加文件到 tar 包
bash
# 追加file.txt到已有的archive.tar
tar -rvf archive.tar file.txt
zip/unzip 命令详解
1、zip 常用用法:
- -r:递归压缩目录
- -v:显示详细的压缩过程
- -m:将文件移动到压缩包中(压缩后删除原文件)
- -q:安静模式,不显示压缩过程
- -9:最高压缩级别
- -0:不压缩,只打包
- -e:加密压缩包
- -x:排除特定文件
2、unzip 常用用法:
- -d:指定解压目录
- -v:查看压缩包内容但不解压
- -l:列出压缩包内容
- -n:不覆盖已存在的文件
- -o:覆盖已存在文件且不提示
- -P:指定解压密码(不推荐在命令行中使用,有安全风险)
1、创建 zip 压缩包
bash
# 压缩单个文件
zip file.zip file.txt
# 压缩目录
zip -r dir.zip directory/
# 压缩时排除某些文件
zip -r archive.zip project/ -x "project/temp/*"
# 创建加密压缩包
zip -er secure.zip sensitive_files/
2、解压 zip 文件
bash
# 解压到当前目录
unzip file.zip
# 解压到指定目录
unzip file.zip -d /path/to/extract/
# 查看压缩包内容
unzip -l file.zip
# 解压加密压缩包
unzip secure.zip
3、其他用法
bash
# 更新压缩包中的文件
zip -u archive.zip new_file.txt
# 测试压缩包完整性
unzip -t file.zip
5 - Linux CentOS7.9 软件管理 (Yum)
RPM 和 YUM 包管理
RPM(Red-Hat Package Manager)是 CentOS 系统中最基础的包管理工具,它可以对 RPM 格式的软件包进行安装、卸载、查询、验证等操作。YUM(Yellowdog Updater Modified)是在 RPM 基础上开发的更高级的软件包管理工具,它能够自动解决软件包之间的依赖关系,大大简化了软件的安装和升级过程。
bash
#安装相关命令
sudo yum install -y 软件名称
#查询相关命令
sudo yum search 关键词:搜索与关键词相关的软件包,包括软件名称和描述信息。
sudo yum list 软件名称:查看指定软件包的安装情况,显示软件包名称、版本、仓库等信息。
sudo yum list installed:列出系统中所有已安装的软件包。
sudo yum list available:列出仓库中所有可安装但未安装的软件包。
sudo yum info 软件名称:查看指定软件包的详细信息,包括描述、版本、大小、依赖等。
#更新相关命令
sudo yum update 软件名称:更新指定软件到最新版本,自动处理依赖关系。
sudo yum update:更新系统中所有可更新的软件包,包括系统组件,建议更新前做好备份。
sudo yum check-update:检查系统中哪些软件包有可用的更新,但不进行实际更新操作。
#卸载相关命令
sudo yum remove 软件名称 卸载指定软件,同时会自动卸载该软件所依赖但不再被其他软件使用的软件包。
#仓库相关命令
sudo yum repolist:列出当前启用的软件仓库,显示仓库名称、ID、状态等信息。
sudo yum repolist all:列出所有软件仓库,包括启用和禁用的。
sudo yum clean all:清除 YUM 缓存的软件包和仓库元数据,释放磁盘空间。
sudo yum makecache:重新生成 YUM 缓存,将仓库元数据和软件包信息缓存到本地,提高后续操作速度。
官方源 & 国内源
安装Nginx
1. 安装 Nginx 官方 RPM 源
首先要创建 Nginx 官方的 yum 源配置文件:
bash
sudo tee /etc/yum.repos.d/nginx.repo <<EOF
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/\$basearch/
gpgcheck=0
enabled=1
EOF
2、清除并重建 yum 缓存
bash
sudo yum clean all
sudo yum makecache
3、安装 Nginx
bash
sudo yum install nginx -y
4、启动并设置开机自启
bash
sudo systemctl start nginx
sudo systemctl enable nginx
5、验证安装结果
bash
nginx -v
卸载Nginx
1、确认 Nginx 是否安装 首先检查系统中是否存在 Nginx 服务:
bash
nginx -v # 查看版本信息(若未安装会提示"command not found")
ps -ef | grep nginx # 查看是否有Nginx进程正在运行
2、查找安装来源 通过以下命令确定安装方式:
bash
# 检查是否通过yum安装
yum list installed | grep nginx
# 检查是否通过源码编译安装(查看常见安装路径)
ls /usr/local/nginx # 源码编译默认路径
ls /etc/nginx # yum安装默认配置路径
# 查找二进制文件位置
which nginx
whereis nginx
3、通用卸载步骤
bash
#停止并禁用 Nginx 服务
sudo systemctl stop nginx
sudo systemctl disable nginx
#尝试通过包管理器卸载
sudo yum remove nginx
#手动删除残留文件
sudo rm -rf /etc/nginx
sudo rm -rf /usr/share/nginx
sudo rm -rf /var/log/nginx
sudo rm -rf /var/www/html
sudo rm -rf /usr/local/nginx # 源码编译的常见路径
#删除服务文件
sudo rm -f /usr/lib/systemd/system/nginx.service
sudo systemctl daemon-reload
指定版本号安装
如果你需要安装特定版本(如 1.20.2
),可以先查看可用版本列表,再选择安装:
bash
#查看可用版本
yum list nginx --showduplicates | sort -r
#安装指定版本
sudo yum install nginx-1.20.2 -y
#升级或降级现有 Nginx
sudo yum update nginx -y
#降级到指定版本
sudo yum downgrade nginx-1.20.2 -y
锁定 Nginx 版本(避免自动更新)
bash
# 安装插件
sudo yum install yum-versionlock -y
#锁定当前版本
sudo yum versionlock add nginx
# 解除锁定(如需升级)
sudo yum versionlock delete nginx
6 - Linux 远程文件上传和下载
一、上传命令
1. scp(Secure Copy)
参数说明:
-r
:用于递归复制目录。-P
:可指定 SSH 端口(注意是大写的 P)。-C
:能启用压缩传输。
bash
# 上传单个文件
scp local.txt user@server:/home/user/
# 上传目录
scp -r local_dir/ user@server:/home/user/
# 从标准输入上传
cat file.txt | scp - user@server:/home/user/remote.txt
2. rsync
参数解释:
-a
:相当于-rlptgoD
,能递归并保留几乎所有文件属性。-v
:开启详细输出模式。-z
:对传输数据进行压缩。--delete
:可删除目标端中源端不存在的文件。--progress
:显示传输进度。
bash
# 同步目录(保留时间戳、权限等)
rsync -avz local_dir/ user@server:/home/user/remote_dir/
# 只同步更改的文件
rsync -avzu --progress local/ user@server:/remote/
# 使用SSH端口2222进行同步
rsync -e 'ssh -p 2222' local/ user@server:/remote/
3. sftp
常用命令:
put local_file
:上传单个文件。put -r local_dir
:递归上传目录。get remote_file
:下载单个文件。ls
/lls
:查看远程 / 本地目录。cd
/lcd
:切换远程 / 本地目录。
bash
# 通过脚本非交互式执行
sftp -b batch_file user@server
# 批处理文件示例(batch_file)
put local.txt
get remote.txt
bye
二、下载命令
1. wget
参数说明:
-c
:支持断点续传。-O
:可指定输出文件名。-r
:递归下载(用于下载整个网站)。--limit-rate=200k
:限制下载速度。
bash
# 下载并重命名文件
wget -O new_name.zip https://example.com/file.zip
# 后台下载
wget -b https://example.com/big_file.zip
# 下载多个文件
wget -i urls.txt # urls.txt 包含多个URL
2. curl
参数解释:
-O
:使用服务器上的文件名保存文件。-o
:自定义输出文件名。-L
:允许重定向。-#
:显示进度条。-u username:password
:用于 HTTP 认证。
bash
# 下载JSON数据并保存
curl -o data.json https://api.example.com/data
# 带认证下载
curl -u user:pass https://private.example.com/file
# 显示响应头信息
curl -I https://example.com
3. scp(下载)
bash
# 下载单个文件
scp user@server:/home/user/remote.txt local/
# 下载目录
scp -r user@server:/home/user/remote_dir/ local/
三、其他命令
1. rz/sz(Zmodem 协议)
bash
# 安装
brew install --cask iterm2
brew install lrzsz # mac本地安装
yum install lrzsz # linux服务器安装
7 - Linux - 文本处理 grep awk sed
在 Linux 系统中,文本处理是日常工作和运维的核心任务之一。grep
、awk
、sed
被誉为文本处理的 "三剑客",它们各自擅长不同的场景,组合使用时能高效解决复杂的文本处理问题。本文将详细介绍这三个命令的常用用法,帮助你快速掌握文本处理技巧。
一、grep:文本搜索工具
grep
(Global Regular Expression Print)主要用于在文本中搜索匹配指定模式的行,支持正则表达式,是文本过滤的利器。
- -i:忽略大小写(不区分大小写匹配)
- -v:反向匹配(输出不匹配模式的行)
- -n:显示匹配行的行号
- -r:递归搜索(在目录下所有文件中搜索)
- -w:匹配完整单词(避免部分匹配)
- -E:使用扩展正则表达式(支持 |、() 等元字符)
- -o:只输出匹配的部分(而非整行)
- -c:统计匹配的行数
示例用法
bash
#在 `file.txt` 中搜索包含 "hello" 的行
grep "hello" file.txt
#忽略大小写搜索
grep -i "hello" file.txt
#搜索包含 "hello" 的行并显示行号:
grep -r -n "hello" file.txt
二、awk:文本分析与处理工具
awk
是一种强大的文本分析工具,擅长按列处理结构化文本(如日志、CSV 文件),支持变量、函数和流程控制,适合复杂的文本提取和转换。
arduino
awk '模式 { 动作 }' [文件...]
- 模式:指定处理哪些行(如行号、正则匹配)。
- 动作:对匹配的行执行操作(如打印列、计算、条件判断)。
常用内置变量
$0
:整行内容$n
:第 n 列的内容(n 为数字,从 1 开始)NF
:当前行的列数(Number of Fields)NR
:当前行的行号(Number of Records)FS
:输入字段分隔符(默认空格或制表符)OFS
:输出字段分隔符(默认空格)
示例用法
bash
#打印 file.txt 的第 1 列和第 3 列
awk '{print $1, $3}' file.txt
#打印行号大于 5 的行
awk 'NR > 5 {print NR, $0}' file.txt
#按逗号分隔(CSV 文件),打印第 2 列:
awk -F ',' '{print $2}' data.csv
#统计文件的总行数:
awk 'END {print NR}' file.txt
#计算第 4 列的总和(假设为数字)
awk '{sum += $4} END {print "总和:", sum}' numbers.txt
#过滤第 2 列等于 "error" 的行,并打印行号和内容:
awk '$2 == "error" {print NR, $0}' log.txt
#自定义输出分隔符为逗号
awk 'BEGIN {OFS=","} {print $1, $2}' file.txt # BEGIN 模式在处理前执行
三、sed:流编辑器
sed
(Stream Editor)是一种流编辑器,主要用于对文本进行批量替换、删除、插入等操作,适合自动化修改文本内容,支持正则表达式。
常用选项
-i
:直接修改原文件(需谨慎使用,建议先备份)-n
:只输出匹配的行(抑制默认输出)-e
:执行多个命令
常用命令
s/旧内容/新内容/
:替换每行中第一个匹配的 "旧内容" 为 "新内容"s/旧内容/新内容/g
:替换每行中所有匹配的 "旧内容" 为 "新内容"(g 表示全局)d
:删除匹配的行p
:打印匹配的行i\文本
:在匹配行前插入文本a\文本
:在匹配行后追加文本
示例用法
bash
#将 file.txt 中所有 "hello" 替换为 "world"(输出到终端,不修改原文件):
sed 's/hello/world/g' file.txt
#直接修改原文件,替换所有 "error" 为 "warning":
sed -i 's/error/warning/g' log.txt # Linux 系统用法
# macOS 需加备份后缀:sed -i '' 's/error/warning/g' log.txt
#删除所有空行
sed '/^$/d' file.txt # ^$ 匹配空行,d 表示删除
#打印包含 "example" 的行(配合 -n 只输出匹配行):
sed -n '/example/p' file.txt
#在第 3 行前插入 "Start Here":
sed '3 i Start Here' file.txt
#同时执行替换和删除操作:
sed -e 's/old/new/g' -e '/delete/d' file.txt
8 - Linux 输出重定向(标准输出与错误输出)
一、文件描述符
- 标准输出 (stdout) :命令执行成功时的正常输出,文件描述符为
1
- 标准错误输出 (stderr) :命令执行出错时的提示信息,文件描述符为
2
- 默认情况下,两者都会显示在终端上,但它们是完全独立的数据流
二、单独重定向操作
1.仅重定向标准输出(正确输出)
覆盖模式:1>
或简化为 >
, 追加模式:1>>
或简化为 >>
bash
# 将ls的正确输出写入file.txt,错误信息仍显示在终端
ls /home 1> file.txt
# 简化写法(推荐)
ls /home > file.txt
# 将系统信息追加到system.log
uname -a 1>> system.log
# 简化写法(推荐)
date >> system.log
2.仅重定向标准错误输出(错误信息)
必须显式指定文件描述符 2
,没有简化写法
bash
# 仅将错误信息写入error.log,正确输出仍显示在终端
ls /invalid/path 2> error.log
# 尝试创建已存在的目录,错误信息会被捕获
mkdir /root/test 2> error.log
# 持续记录错误信息到日志文件(不覆盖历史)
sudo apt update 2>> update_errors.log
三、组合重定向操作
1.分别重定向到不同文件
bash
# 正确信息存result.txt,错误信息存errors.txt
wget https://example.com/file.iso 1> result.txt 2> errors.txt
# 编译程序时分离输出
gcc program.c -o program 1> compile_output.txt 2> compile_errors.txt
2.都重定向到同一个文件
方法 1:&>(覆盖模式)
bash
# 所有输出(正确+错误)都写入all_output.log(覆盖原有内容)
ping -c 3 example.com &> ping_results.log
方法 2:&>>
(追加模式)
bash
# 所有输出追加到日志文件
./daily_backup.sh &>> backup_combined.log
方法 3:兼容性写法 > file 2>&1
bash
# 覆盖模式(等价于&>)
curl https://api.example.com > api_response.log 2>&1
# 追加模式(等价于&>>)
curl https://api.example.com >> api_response.log 2>&1
3.混合处理(过滤不需要的输出)
仅保留正确输出,丢弃错误信息
bash
# 错误信息被丢弃(发送到/dev/null黑洞)
ls *.txt > text_files.txt 2> /dev/null
# 下载文件但不显示错误
wget -q https://example.com/file.zip 2> /dev/null
仅保留错误信息,丢弃正确输出
bash
# 正确输出被丢弃,只记录错误
find / -name "secret.txt" > /dev/null 2> find_errors.log
# 测试命令是否存在,只捕获错误
command -v non_existent_cmd > /dev/null 2> cmd_check.log
9 - Linux 管道符与 sort、wc、uniq 命令详解
一、管道符 |
基础
管道符的作用是将前一个命令的标准输出 作为后一个命令的标准输入,实现命令间的数据传递。
bash
command1 | command2 | command3
特点:
- 管道只处理标准输出(stdout),标准错误(stderr)不会通过管道传递
- 管道中的命令并行执行,数据实时传递
- 可无限串联多个命令
二、sort
命令:排序文本内容
常用选项
-n
:按数值大小排序(而非字符串)-r
:反向排序(降序)-k
:指定排序的列(字段)-t
:指定字段分隔符-u
:去除重复行(排序后相同的行只保留一行)-o
:将排序结果写入指定文件(而非标准输出)
示例
bash
# 基本排序:
# 对文件内容按字典顺序排序
sort names.txt
# 对命令输出排序(如查看所有用户并排序)
cat /etc/passwd | cut -d: -f1 | sort
#数值排序:
# 按数值大小排序(适合处理数字列表)
sort -n numbers.txt
# 按数值降序排序
sort -nr numbers.txt
#按指定字段排序:
# 按第3列数值排序(以空格为分隔符)
sort -k3n data.txt
# 以冒号为分隔符,按第3列数值降序排序(适合/etc/passwd文件)
sort -t: -k3nr /etc/passwd
#去重并排序:
# 排序并去除重复行(等价于 sort file | uniq)
sort -u words.txt
三、wc
命令:统计文本数据
wc
(Word Count)命令用于统计文本的行数、单词数和字符数。
常用选项
-l
:只统计行数-w
:只统计单词数-c
:只统计字符数(包括空格和换行符)-m
:只统计字符数(考虑多字节字符)
bash
#基本统计:
# 统计文件的行数、单词数、字符数
wc document.txt
# 输出格式:行数 单词数 字符数 文件名
#只统计行数:
# 统计当前目录下的文件数量
ls | wc -l
# 统计日志中包含"ERROR"的行数
grep "ERROR" app.log | wc -l
#统计单词和字符:
# 统计文档的单词数
wc -w essay.txt
# 统计字符串的字符数
echo "Hello World" | wc -c # 包含空格和换行符,输出12
四、uniq
命令:处理重复行
uniq
命令用于检测和删除文本中的重复行,注意:它只处理相邻的重复行 ,通常与 sort
配合使用。
常用选项
-u
:只显示不重复的行-d
:只显示重复的行(至少出现两次)-c
:显示每行的重复次数-i
:忽略大小写比较
bash
#去除重复行:
# 先排序使重复行相邻,再去重(最常用组合)
sort words.txt | uniq
#统计重复次数:
# 统计每个单词出现的次数(并按次数排序)
sort words.txt | uniq -c | sort -nr
# 统计日志中每个IP的访问次数
grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" access.log | sort | uniq -c | sort -nr
#筛选特定行:
# 只显示重复出现的行
sort data.txt | uniq -d
# 只显示不重复的行
sort data.txt | uniq -u
五、命令组合实战案例
1.分析系统用户
bash
# 查看系统用户ID(UID)并按UID排序,显示前5个
cat /etc/passwd | cut -d: -f1,3 | sort -t: -k2n | head -n5
2.日志分析
bash
# 统计Web服务器日志中访问量最高的前10个页面
cat access.log | awk '{print $7}' | sort | uniq -c | sort -nr | head -n10
3.处理数据文件
bash
# 分析CSV文件:按第4列数值排序,去重,统计总行数
cat data.csv | sort -t',' -k4nr | uniq | wc -l
4.系统进程分析
bash
# 查找内存占用最高的前5个进程
ps aux | sort -k4nr | head -n5
5.文本内容分析
bash
# 统计一篇文章中出现频率最高的前10个单词
cat article.txt | tr '[:upper:]' '[:lower:]' | grep -oE '\b[a-z]+\b' | sort | uniq -c | sort -nr | head -n10
10 - Linux 定时任务
Linux中的定时任务由crontab
命令来执行,用来读取和修改名为crontab
的文件,crontab
文件包含了你要定时执行的程序列表,也包含了执行的时刻。
crontab
用于修改crontab文件,cron用于实际执行定时的程序。
bash
crontab [选项]
常用选项
-e
: 编辑当前用户的 crontab 文件-l
: 列出当前用户的 crontab 任务-r
: 删除当前用户的所有 crontab 任务-u 用户名
: 管理指定用户的 crontab(需 root 权限)
命令格式:
bash
* * * * * 命令
分 时 日 月 周 要执行的命令
- 每个字段的取值范围:
- 分: 0-59
- 时: 0-23
- 日: 1-31
- 月: 1-12 或 Jan-Dec
- 周: 0-6 或 Sun-Sat(0 和 7 都代表周日)
- 特殊符号:
*
: 匹配所有值(如*
在分字段表示每分钟),
: 分隔多个值(如1,3,5
表示 1、3、5)-
: 表示范围(如1-5
表示 1 到 5)/n
: 每隔 n 单位(如*/10
在分字段表示每 10 分钟)
例句
bash
#每分钟执行一次命令
* * * * * echo "每分钟执行" >> ~/cron.log
#每天凌晨 3 点执行备份
0 3 * * * /usr/local/bin/backup.sh
#每周一、三、五的 18:30 执行脚本
30 18 * * 1,3,5 /home/user/script.sh
#每月 1 日和 15 日的 12:00 执行命令
0 12 1,15 * * /path/to/command
#每小时的第 15 分钟执行
15 * * * * /path/to/command
#工作日(周一至周五)9:00 执行
0 9 * * 1-5 /path/to/command
#每10分钟执行一次
*/10 * * * * /path/to/your/command >> /path/to/your/logfile.log 2>&1
Linux 查看系统软件硬件信息
在 Linux 系统管理和运维中,了解系统的软硬件信息是基础操作。本文档将详细介绍查看 Linux 系统硬件(如 CPU、内存、磁盘、网络等)和软件(如操作系统版本、内核信息、安装软件等)信息的常用命令及用法。
一、系统基础信息查看
1. 操作系统版本信息
-
lsb_release -a
显示 Linux 标准基础(LSB)信息,包括发行版名称、版本号、描述等(需安装lsb-core
包)。 -
cat /etc/os-release
从系统文件中直接读取操作系统版本信息,适用于大多数 Linux 发行版(如 Ubuntu、CentOS、Debian 等)。 关键字段:NAME
(发行版名称)、VERSION
(版本)、ID
(发行版 ID)。 -
cat /etc/issue
显示登录前的系统提示信息,通常包含简化的版本信息。
2.内核信息
-
uname -a
显示完整的内核信息,包括内核版本、主机名、硬件架构、操作系统类型等。 -
uname -r
仅显示内核版本号(如5.15.0-78-generic
)。 -
cat /proc/version
从内核进程文件中读取内核版本及编译信息,包含 GCC 版本等细节。
3.系统运行时间与负载
-
uptime
显示系统运行时间、当前登录用户数及系统负载(1 分钟、5 分钟、15 分钟平均负载)。 -
w
在uptime
基础上增加当前登录用户及用户执行的命令信息。 -
top
或htop
动态查看系统负载、进程资源占用等信息(htop
需单独安装,界面更友好)。
二、硬件信息查看
1. CPU 信息
lscpu
显示 CPU 架构、核心数、线程数、主频、缓存等详细信息。 关键参数:CPU(s)
(总逻辑核心数)、Core(s) per socket
(每颗 CPU 核心数)、Socket(s)
(CPU 插槽数)、Thread(s) per core
(每核心线程数)。cat /proc/cpuinfo
从内核文件中读取 CPU 详细参数,包括每个核心的型号、主频、缓存等(多核心会显示多条记录)。
2.内存信息
free -h
以人类可读的单位(GB、MB)显示内存使用情况,包括总内存、已使用、空闲、缓存 / 缓冲区占用等。cat /proc/meminfo
显示更详细的内存参数,如物理内存、交换分区、缓存、可用内存等具体数值(单位:KB)。vmstat -s
统计内存相关的各种指标,如内存总容量、页交换次数、内存分配失败次数等。
3. 磁盘信息
(1)磁盘分区与容量
df -h
以人类可读单位显示磁盘分区的使用情况,包括总容量、已使用、可用空间及挂载点。lsblk
以树形结构显示磁盘分区布局,包括磁盘名称(如sda
)、分区(如sda1
)、大小、挂载点等。fdisk -l
显示磁盘分区表详细信息,需 root 权限(sudo fdisk -l
),可查看磁盘类型(MBR/GPT)、分区大小等。
(2)磁盘 I/O 性能
iostat
监控磁盘 I/O 使用率、读写速度、响应时间等(需安装sysstat
包)。iotop
动态查看进程的磁盘 I/O 占用情况(需 root 权限,需安装iotop
包)。
4. 网络信息
(1)网络接口与 IP
ip addr
或ifconfig
显示网络接口的 IP 地址、MAC 地址、子网掩码等信息(ifconfig
需安装net-tools
包)。ip route
或route -n
查看路由表信息,包括默认网关(default
条目)。
(2)网络连接与端口
ss -tuln
显示当前监听的 TCP/UDP 端口及对应的进程(-t
:TCP,-u
:UDP,-l
:监听,-n
:数字形式显示端口)。netstat -tuln
功能同ss -tuln
,但需安装net-tools
包。lsof -i :端口号
查看指定端口被哪个进程占用(如lsof -i :80
查看 80 端口占用)。
(3)网络带宽与流量
iftop
实时监控网络接口的带宽使用情况,按连接显示上传 / 下载速度(需安装iftop
包)。nload
以图形化方式显示总带宽使用情况(需安装nload
包)。
5. 显卡信息
lspci | grep -i vga
显示显卡型号信息(集成或独立显卡)。 示例:01:00.0 VGA compatible controller: NVIDIA Corporation GP106 [GeForce GTX 1060 6GB] (rev a1)
nvidia-smi
若为 NVIDIA 显卡且安装驱动,可显示显卡型号、显存使用、温度、进程占用等详细信息。
6. 主板与硬件汇总
lspci
显示所有 PCI 总线设备信息,包括显卡、网卡、声卡、主板芯片组等。 可用lspci -v
查看更详细的设备描述。lsusb
显示所有 USB 设备信息,包括鼠标、键盘、U 盘、外置硬盘等。dmidecode
读取硬件的 DMI(桌面管理接口)信息,需 root 权限,可查看主板型号、BIOS 版本、内存插槽信息等。 示例:sudo dmidecode -t memory
(查看内存详细信息)、sudo dmidecode -t baseboard
(查看主板信息)。
三、软件信息查看
- 已安装软件包
(1)Debian/Ubuntu 系统(APT 包管理)
dpkg -l
列出所有已安装的软件包,可配合grep
筛选(如dpkg -l | grep python
查找 Python 相关包)。apt list --installed
以更简洁的格式显示已安装软件包。
(2)CentOS/RHEL 系统(RPM/YUM 包管理)
rpm -qa
列出所有已安装的 RPM 包,筛选示例:rpm -qa | grep java
。yum list installed
或dnf list installed
通过 YUM/DNF 工具查看已安装软件包。
- 系统服务信息
systemctl list-unit-files --type=service
列出所有系统服务及其状态(启用 / 禁用)。systemctl status 服务名
查看指定服务的运行状态(如systemctl status sshd
查看 SSH 服务)。ps aux
列出当前运行的所有进程,包含进程名、PID、资源占用等信息(可配合grep
筛选特定进程)。
Linux内存与磁盘
一、内存管理常用命令
内存管理是 Linux 系统运维的核心任务之一,以下是监控和管理内存的常用命令。
1.free - 查看内存使用情况
功能:显示系统内存总量、已使用、空闲及缓冲区等信息。
常用参数:
-h
:以人类可读的单位(GB、MB)显示-m
:以 MB 为单位显示-g
:以 GB 为单位显示-s <秒数>
:持续刷新显示,间隔指定秒数
bash
free -h # 人性化显示内存使用
free -s 5 # 每5秒刷新一次内存信息
sql
[stark@192 ~]$ free -h
total used free shared buff/cache available
Mem: 3.7G 1.0G 1.8G 26M 856M 2.4G
Swap: 3.9G 0B 3.9G
内存(Mem)使用情况说明
- 系统总物理内存为 3.7GB。
- 已被进程直接使用的内存为 1.0GB,这部分包括正在运行的应用程序和服务所占用的内存。
- 完全空闲且未被任何进程或系统缓存使用的内存为 1.8GB。
- 被多个进程共享的内存为 26M,通常用于共享库、临时文件等,数值较小属于正常情况。
- 系统缓存的内存(buff/cache)为 856M,其中包含临时存储磁盘数据的 buffer 和临时存储文件数据的 cache,这部分内存可被系统自动释放给需要的进程。
- 系统当前可立即分配给新进程的可用内存为 2.4GB,包括空闲内存和可释放的缓存内存,这是衡量内存可用性的关键指标。
交换分区(Swap)使用情况
- 交换分区的总大小为 3.9GB,它用于在物理内存不足时临时存储不活跃进程的数据。
- 当前交换分区的使用量为 0B,说明物理内存充足,无需依赖虚拟内存。
- 交换分区的空闲大小为 3.9GB。
2. top
- 实时系统资源监控
功能:动态显示进程的资源占用情况,包括内存、CPU 使用率等。
内存相关操作:
- 进入界面后按
M
:按内存使用率排序进程 - 按
P
:按 CPU 使用率排序 - 按
q
:退出监控界面
3.htop
- 增强版进程监控
功能:比 top
更直观的交互式界面,支持鼠标操作和彩色显示。htop需要进行安装:在 RHEL/CentOS 系统中,htop 通常在 EPEL (Extra Packages for Enterprise Linux) 源中。
bash
#首先安装 EPEL 源
# CentOS/RHEL 7
sudo yum install epel-release
# CentOS/RHEL 8 及以上
sudo dnf install epel-release
#安装完成后,再尝试安装 htop:
sudo yum install htop
二、磁盘管理常用命令
磁盘管理命令用于查看磁盘分区、使用率、挂载状态,以及管理文件系统等。
1. df - 查看磁盘分区使用率
显示所有挂载的磁盘分区的总容量、已使用容量、可用容量和使用率。
常用参数:
-h
:以人类可读的单位(GB、MB)显示。-T
:显示分区的文件系统类型(如 ext4、xfs)。
bash
df -h # 人性化显示磁盘使用率
df -hT # 显示磁盘使用率及文件系统类型
2.du
- 查看目录 / 文件占用磁盘空间
计算指定目录或文件的磁盘占用大小,常用于排查大文件或目录。
常用参数:
-h
:以人类可读单位显示。-s
:仅显示总和(不列出子目录详情)。-sh *
:显示当前目录下所有文件 / 目录的总大小。-d <深度>
:限制显示的目录深度(如-d 1
仅显示一级子目录)。
bash
du -sh /home # 查看/home目录总占用空间
du -h -d 1 /var # 查看/var目录下一级子目录的空间占用
du -h --max-depth=1
3.fdisk
- 磁盘分区管理工具
用于查看、创建、删除磁盘分区(需管理员权限),支持 MBR 分区表。
-l
:列出所有磁盘及分区信息。/dev/sdX
:指定操作的磁盘(如/dev/sda
为第一块硬盘)。
bash
sudo fdisk -l # 查看所有磁盘和分区信息
sudo fdisk /dev/sdb # 对第二块硬盘进行分区操作(进入交互模式)
4.parted
- 高级磁盘分区工具
支持 GPT 分区表和更大容量磁盘,可创建、调整分区大小(需管理员权限)。
-l
:列出所有磁盘及分区信息(包括 GPT 分区)。/dev/sdX
:指定操作的磁盘。
bash
sudo parted -l # 查看所有磁盘分区(含GPT)
sudo parted /dev/sdb # 进入交互模式管理第二块硬盘
5.mount
与 umount
- 挂载 / 卸载文件系统
mount
用于将磁盘分区或外部设备挂载到系统目录;umount
用于卸载已挂载的设备。
mount <设备路径> <挂载点>
:挂载指定设备到目标目录。umount <挂载点>
:卸载指定挂载点的设备。-l
:mount -l
列出所有已挂载的设备及信息。
bash
sudo mount /dev/sdb1 /mnt/external # 挂载/dev/sdb1到/mnt/external
sudo umount /mnt/external # 卸载/mnt/external
mount -l # 查看所有挂载的设备
6.lsblk
- 查看磁盘及分区结构
以树形结构显示磁盘、分区及挂载点信息,直观展示存储设备关系。
常用参数:
-f
:显示文件系统类型和 UUID。-l
:以列表形式显示(非树形)。
bash
lsblk # 树形显示磁盘分区结构
lsblk -f # 显示分区的文件系统和UUID
Linux 进程管理
在 Linux 系统中,进程是程序的运行实例,进程管理是系统运维和日常使用的核心技能之一。本文档将系统整理常用的 Linux 进程管理命令,包括进程查看、控制、状态分析等核心操作。
一、进程基础概念
在开始学习命令前,先明确几个核心概念:
- 进程(Process):程序的一次执行过程,拥有独立的内存空间、PID(进程 ID)和状态。
- PID:每个进程的唯一标识符,由系统自动分配,范围通常为 1 - 32768(可通过内核参数调整)。
- PPID:父进程 ID,标识当前进程的创建者。
- 进程状态:包括运行(R)、睡眠(S)、僵尸(Z)、停止(T)等
二、进程查看命令
1.ps
:查看当前进程快照
ps
是最基础的进程查看命令,用于获取系统在某一时刻的进程状态快照。
常用参数:
-a
:显示所有用户的进程(不含会话引线)-u
:以用户为中心显示进程信息(含 CPU、内存占用)-x
:显示无控制终端的进程-e
:显示所有进程(等价于-A
)-f
:显示完整格式信息(UID、PID、PPID、CMD 等)-l
:显示长格式信息(含进程状态、优先级等)
bash
# 显示所有进程的完整信息
ps -ef
# 以用户为中心显示进程详细信息
ps -u username
# 查看指定进程(如PID为1234的进程)
ps -p 1234
# 以树状结构显示进程关系
ps -ef --forest
输出字段说明:
-
PID 表示进程 ID
-
PPID 表示父进程 ID
-
UID 表示进程所属用户 ID
-
C 表示进程 CPU 使用率(百分比)
-
STIME 表示进程启动时间
-
TTY 表示进程关联的终端
-
TIME 表示进程累计占用 CPU 时间
-
CMD 表示启动进程的命令
2. top
:实时监控进程动态
top
命令用于实时动态地查看系统进程状态,默认每 3 秒刷新一次,是性能分析的常用工具。
核心功能:
- 实时显示进程 CPU、内存占用率
- 支持按 CPU、内存等指标排序
- 可交互操作(如终止进程、调整刷新频率)
常用交互快捷键:
P
:按 CPU 使用率排序(默认)M
:按内存使用率排序N
:按 PID 排序k
:终止指定 PID 的进程q
:退出 tops
:调整刷新间隔时间(秒)h
:显示帮助信息
bash
# 启动top监控
top
# 只显示指定用户的进程
top -u username
# 以批处理模式运行(非交互式,适合脚本)
top -b -n 1 # 只输出1次结果
3.htop
:增强版进程监控工具
htop
是 top
的增强替代工具,提供更友好的交互界面和更多功能(需单独安装,如 sudo apt install htop
)。
优势特性:
- 支持鼠标操作
- 彩色显示进程状态
- 横向滚动查看完整命令
- 内置进程搜索和过滤功能
常用操作:
-
F2
:进入设置界面(调整显示字段、颜色等) -
F3
:搜索进程 -
F4
:过滤进程 -
F5
:切换树状视图 -
F9
:发送信号终止进程(如 SIGKILL) -
q
:退出 htop
4. pstree
:以树状结构显示进程关系
pstree
命令用于以树状图形式展示进程间的父子关系,清晰呈现进程的创建层级。
常用参数:
-p
:显示每个进程的 PID-u
:显示进程所属用户-a
:显示完整命令行参数-h
:高亮显示当前进程及其父进程
bash
# 显示所有进程的树状关系及PID
pstree -p
# 显示指定用户的进程树
pstree username
# 高亮显示PID为1234的进程及其祖先
pstree -h 1234
三、进程控制命令
1. kill
:终止进程
kill
命令通过向进程发送信号来控制进程,默认发送 SIGTERM
(15)信号请求进程终止。
常用信号:
-
1 号信号 SIGHUP 表示重新加载配置(不终止进程)
-
9 号信号 SIGKILL 表示强制终止进程(无法被忽略)
-
15 号信号 SIGTERM 表示正常终止进程(默认信号,可被捕获)
-
19 号信号 SIGSTOP 表示暂停进程(无法被忽略)
-
20 号信号 SIGTSTP 表示暂停进程(可被忽略,通常由 Ctrl+Z 触发)
bash
# 发送默认信号终止进程(PID=1234)
kill 1234
# 强制终止进程(无法被进程捕获)
kill -9 1234
# 重新加载进程配置(如Nginx、Apache)
kill -1 5678 # 等价于 kill -HUP 5678
# 通过进程名终止进程(结合pkill使用更方便)
kill -9 $(ps -ef | grep "process_name" | grep -v grep | awk '{print $2}')
2.pkill
/pgrep
:按名称操作进程
pgrep
:通过进程名或其他属性查找进程 PIDpkill
:通过进程名发送信号(相当于pgrep + kill
的组合)
常用参数:
-u
:按用户筛选进程-f
:匹配完整命令行(含参数)-l
:显示进程名(仅 pgrep)-n
:只匹配最新启动的进程-o
:只匹配最早启动的进程
bash
# 查找名为"nginx"的进程PID
pgrep nginx
# 查找进程名并显示PID和进程名
pgrep -l nginx
# 终止所有名为"python"的进程
pkill python
# 终止用户"test"的所有进程
pkill -u test
# 匹配包含"chrome"的完整命令行进程
pkill -f "chrome --incognito"
3.jobs
/fg
/bg
:管理后台进程
用于控制终端会话中的前台 / 后台进程,常见于命令行任务管理。
命令说明:
jobs
:显示当前终端的后台任务列表fg %N
:将第 N 个后台任务切换到前台bg %N
:将暂停的后台任务继续运行&
:在命令末尾添加,直接将任务放入后台运行Ctrl+Z
:暂停当前前台任务并放入后台
bash
# 启动后台任务(如长时间运行的脚本)
python long_running_script.py &
# 查看后台任务列表
jobs
# 将编号为1的后台任务切换到前台
fg %1
# 暂停前台任务(按Ctrl+Z)
# [1]+ Stopped python long_running_script.py
# 让暂停的任务在后台继续运行
bg %1
# 终止后台任务(先通过jobs查编号,再用kill)
kill %1
4.nohup
:忽略挂断信号运行进程
nohup
命令用于启动进程,使其在终端关闭后仍能继续运行(忽略 SIGHUP
信号)。
bash
# 后台运行脚本,输出重定向到nohup.out
nohup python script.py &
# 自定义输出文件路径
nohup ./server.sh > server.log 2>&1 &
# 说明:2>&1 表示将错误输出(stderr)重定向到标准输出(stdout)
四、常用场景示例
场景 1:查找高 CPU 占用的进程
perl
# 方法1:使用top实时查看(按P排序)
top
# 方法2:使用ps一次性查看
ps -eo pid,ppid,%cpu,%mem,cmd --sort=-%cpu | head -10
场景 2:查找高内存占用的进程
bash
# 方法1:top按内存排序(按M)
top
# 方法2:ps按内存排序
ps -eo pid,ppid,%cpu,%mem,cmd --sort=-%mem | head -10
场景 3:强制终止无响应的程序
bash
# 先查找程序PID
pgrep -l firefox
# 强制终止(若普通kill无效)
pkill -9 firefox
# 或通过PID
kill -9 12345
场景 4:后台运行任务并持久化输出
bash
# 后台运行并记录日志
nohup ./data_process.sh > process.log 2>&1 &
# 查看日志输出
tail -f process.log