Linux一些常用命令
nginx 配置文件路径 1 2 /etc/nginx/nginx.conf /etc/nginx/sites-available/default
验证配置文件
刷新配置文件
配置文件参考 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 server { server_name default_server; location /.well-known/acme-challenge/ { root /var/www/html; } location / { return 301 https://$host$request_uri ; } listen 443 ssl; ssl_certificate /etc/letsencrypt/live/teman.xxx.xx/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/teman.xxx.xx/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; } server { listen 80; server_name default_server; location /.well-known/acme-challenge/ { root /var/www/html; } location / { return 301 https://$host$request_uri ; } } server { listen 443 ssl default_server; server_name home.xxx.xx; add_header X-Frame-Options "DENY" always; add_header Content-Security-Policy "frame-ancestors 'none';" always; ssl_certificate /etc/letsencrypt/live/teman.xxx.xx/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/teman.xxx.xx/privkey.pem; root /data/apps/web/dist; index index.html; error_page 404 /404.html; location / { try_files $uri $uri / $uri .html =404; } } server { listen 443 ssl; server_name www.xxx.xx xxx.xx; ssl_certificate /etc/letsencrypt/live/teman.xxx.xx/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/teman.xxx.xx/privkey.pem; root /data/apps/webmail/dist; index index.html; error_page 404 /index.html; location / { try_files $uri $uri / =404; } location = /404.html { root /data/apps/webmail; internal; } } server { listen 443 ssl; server_name teman.xxx.xx; ssl_certificate /etc/letsencrypt/live/teman.xxx.xx/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/teman.xxx.xx/privkey.pem; root /data/apps/webadmin/dist; index index.html; error_page 404 /index.html; location / { try_files $uri $uri / =404; } location = /404.html { root /data/apps/webadmin; internal; } } server { listen 443 ssl; server_name backend.xxx.xx; client_max_body_size 30M; add_header X-Frame-Options "DENY" always; add_header Content-Security-Policy "frame-ancestors 'none';" always; ssl_certificate /etc/letsencrypt/live/teman.xxx.xx/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/teman.xxx.xx/privkey.pem; location ^~ /aiServer/ { return 403; } location /api/v1/ws/ { proxy_pass http://127.0.0.1:6001; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade ; proxy_set_header Connection "upgrade" ; proxy_set_header Host $host ; proxy_set_header X-Real-IP $remote_addr ; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto $scheme ; proxy_read_timeout 3600s; proxy_send_timeout 3600s; send_timeout 3600s; } location / { proxy_pass http://127.0.0.1:6001; proxy_http_version 1.1; proxy_set_header Host $host ; proxy_set_header X-Real-IP $remote_addr ; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto $scheme ; } location /service/logs/realtime { proxy_pass http://127.0.0.1:6001; proxy_http_version 1.1; proxy_set_header Host $host ; proxy_set_header X-Real-IP $remote_addr ; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto $scheme ; proxy_buffering off; proxy_cache off; proxy_set_header Connection '' ; chunked_transfer_encoding off; proxy_read_timeout 3600s; proxy_send_timeout 3600s; send_timeout 3600s; } location /thirdParty/chat/conversationWithType { proxy_pass http://127.0.0.1:6001; proxy_http_version 1.1; proxy_set_header Host $host ; proxy_set_header X-Real-IP $remote_addr ; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto $scheme ; proxy_buffering off; proxy_cache off; proxy_set_header Connection '' ; chunked_transfer_encoding off; proxy_read_timeout 3600s; proxy_send_timeout 3600s; send_timeout 3600s; } } server { listen 443 ssl; server_name ope.xxx.xx; ssl_certificate /etc/letsencrypt/live/teman.xxx.xx/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/teman.xxx.xx/privkey.pem; root /data/apps/opeAdmin/dist; index index.html; error_page 404 /index.html; location / { try_files $uri $uri / =404; } location = /404.html { root /data/apps/opeAdmin; internal; } } server { listen 443 ssl; server_name ops.xxx.xx; client_max_body_size 30M; ssl_certificate /etc/letsencrypt/live/teman.xxx.xx/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/teman.xxx.xx/privkey.pem; location / { proxy_pass http://127.0.0.1:2122; proxy_http_version 1.1; proxy_set_header Host $host ; proxy_set_header X-Real-IP $remote_addr ; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto $scheme ; } }
其他
操作
命令
启动 Nginx
sudo systemctl start nginx
停止 Nginx
sudo systemctl stop nginx
重启 Nginx(强制)
sudo systemctl restart nginx
平滑重载配置
sudo systemctl reload nginx
查看 Nginx 状态
sudo systemctl status nginx
检查配置语法
nginx -t
查看配置文件路径
nginx -V
(查看 --conf-path
)
https证书 安装环境 1 2 sudo apt update sudo apt install certbot python3-certbot-nginx
生成证书 在申请证书前,请确保要申请的域名(例如 example.com 或 www.example.com )已经解析到服务器的 IP 地址,否则验证会失败
1 sudo certbot --nginx -d xx.com -d mail.xx.com -d www.xx.com
有几个域名就-d几次,根据上面nginx配置的域名示例
1 sudo certbot --nginx -d home.kretest.com -d www.kretest.com -d backend.kretest.com -d kretest.com -d mail.xx.com -d teman.kretest.com
续订证书 证书到期后发现自动续订没有生效,然后去手动续订
全部续订
续订后需要重启Nginx,或者把Nginx平滑重载配置
只续签某个证书 1 sudo certbot certonly --nginx -d xx.com -d mail.xx.com -d www.xx.com
续订后需要重启Nginx,或者把Nginx平滑重载配置
自动续签 1 systemctl list-timers | grep certbot
查看证书到期时间 1 sudo openssl x509 -in /etc/letsencrypt/live/xx.com/fullchain.pem -noout -dates
测试续签 不会真的修改证书
1 sudo certbot renew --dry-run
如果没有报错,就说明自动续订没问题
手动续订报错 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 root@kremail-dev:~ Traceback (most recent call last): File "/usr/bin/certbot" , line 6, in <module> from pkg_resources import load_entry_point ModuleNotFoundError: No module named 'pkg_resources' Error in sys.excepthook: Traceback (most recent call last): File "/usr/lib/python3/dist-packages/apport_python_hook.py" , line 72, in apport_excepthook from apport.fileutils import likely_packaged, get_recent_crashes File "/usr/lib/python3/dist-packages/apport/__init__.py" , line 5, in <module> from apport.report import Report File "/usr/lib/python3/dist-packages/apport/report.py" , line 32, in <module> import apport.fileutils File "/usr/lib/python3/dist-packages/apport/fileutils.py" , line 12, in <module> import os, glob, subprocess, os.path, time, pwd , sys, requests_unixsocket File "/usr/lib/python3/dist-packages/requests_unixsocket/__init__.py" , line 1, in <module> import requests ModuleNotFoundError: No module named 'requests' Original exception was: Traceback (most recent call last): File "/usr/bin/certbot" , line 6, in <module> from pkg_resources import load_entry_point ModuleNotFoundError: No module named 'pkg_resources'
看日志代表机器上的 Certbot 是 Python 版,但是依赖缺失(大概率是 python3-pkg-resources 或 python3-requests 包没装,或者被误删了)
起初尝试补缺少的依赖
1 2 sudo apt update sudo apt install --reinstall python3-pkg-resources python3-requests
然后再执行手动续订,还是报错
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 root@kremail-dev:~ Traceback (most recent call last): File "/usr/bin/certbot" , line 11, in <module> load_entry_point('certbot==0.40.0' , 'console_scripts' , 'certbot' )() File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py" , line 490, in load_entry_point return get_distribution(dist).load_entry_point(group, name) File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py" , line 2854, in load_entry_point return ep.load() File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py" , line 2445, in load return self.resolve() File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py" , line 2451, in resolve module = __import__(self.module_name, fromlist=['__name__' ], level=0) File "/usr/lib/python3/dist-packages/certbot/main.py" , line 17, in <module> from certbot import account File "/usr/lib/python3/dist-packages/certbot/account.py" , line 10, in <module> import pyrfc3339 File "/usr/lib/python3/dist-packages/pyrfc3339/__init__.py" , line 17, in <module> from pyrfc3339.generator import generate File "/usr/lib/python3/dist-packages/pyrfc3339/generator.py" , line 1, in <module> import pytz ModuleNotFoundError: No module named 'pytz'
再补pytz,没有成功,而且如果继续提示缺别的模块(比如 acme, zope),就要一个个补,比较麻烦,然后想着直接重装
1 2 sudo apt update sudo apt install --reinstall certbot python3-certbot-nginx -y
重装证书后还是报错,算了,直接弃用,直接上脚本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 #!/bin/bash set -eecho "🔍 检查 Certbot 版本..." if command -v certbot >/dev/null 2>&1; then VERSION=$(certbot --version 2>/dev/null | awk '{print $2}' ) echo "当前 Certbot 版本: $VERSION " else VERSION="none" echo "未安装 Certbot" fi if [[ "$VERSION " == "none" ]] || [[ "$VERSION " == 0.* ]] || dpkg -l | grep -q certbot; then echo "🗑️ 移除旧版 Certbot (apt 包)..." apt remove -y certbot python3-certbot-nginx || true fi echo "📦 确保 snapd 已安装..." apt update -y apt install -y snapd echo "⬇️ 安装最新版 Certbot (snap 包)..." snap install --classic certbot echo "🔗 建立软链 /usr/bin/certbot" ln -sf /snap/bin/certbot /usr/bin/certbot echo "✅ Certbot 版本:" certbot --version echo "🧪 测试续签 (--dry-run)..." sudo certbot renew --dry-run || { echo "❌ 测试续签失败,请检查 Nginx 配置或 DNS 解析。" exit 1 } echo "🎉 Certbot 已更新并测试成功!证书续签已准备就绪。"
1 2 3 4 touch fix_certbot.sh vim fix_certbot.sh chmod +x fix_certbot.sh sudo bash fix_certbot.sh
搞定,然后重启Nginx,续订后需要过几分钟才生效。
执行完成后用上面步骤的命令查看一下到期时间,如果到期时间没有成功延期,尝试手动延期一下
snap 版自带 systemd 定时任务,会每天自动运行一次 certbot renew,如果证书快到期就续订,并自动 reload Nginx/Apache。
1 systemctl list-timers | grep certbot
如果有类似输出,说明每天会执行一次。
1 Sat 2025-09-13 00:00:00 UTC ... snap.certbot.renew.timer certbot.renew.service
查看任务内容
1 2 systemctl cat snap.certbot.renew.service systemctl cat snap.certbot.renew.timer
正常会看到它执行的是
1 /usr/bin/snap run certbot renew --quiet
要测试自动续订的话执行上面步骤的测试续订
查看内存使用
查看日志 1 2 tail -f xxx.log tail -100f xxx.log
搜索日志 1 grep -C 3 "开始BC匹配" info.log
查看硬盘使用
查看硬盘使用排序 1 du -h --max-depth=1 / | sort -hr | head -n 10
查看硬盘使用排序,指定文件夹 /data 是文件夹 可替换为具体的
1 du -h --max-depth=1 /data | sort -hr | head -n 10
权限相关 赋予可执行权限
说明: 为文件 script.sh 添加执行权限,使其可以被运行。适用于脚本或二进制文件。
赋予读、写、执行权限给所有用户
说明: a 表示所有用户(owner、group、others),+rwx 添加读(r)、写(w)、执行(x)权限。
仅给文件所有者添加执行权限
说明: u 表示文件所有者(user),+x 添加执行权限。
设置精确权限(八进制表示法)
说明: 使用八进制设置权限: • 7 = 读(r) + 写(w) + 执行(x) = 4 + 2 + 1 • 5 = 读(r) + 执行(x) = 4 + 1 • 所以 755 表示: • 所有者:rwx • 所属组:r-x • 其他人:r-x
vim
📝 所有命令默认为在「普通模式」下使用(按 Esc
退出插入模式后进入)
📌 导航相关
操作
命令
使用说明
跳转到第一行
gg
按 Esc
回到普通模式,再按 gg
跳转到最后一行
G
普通模式下按 G
跳转到第 N 行
:N
或 Ngg
:
输入后需按回车;或直接用 Ngg
跳转到当前行第一个非空字符
^
普通模式下按 ^
跳转到当前行最开始位置
0
普通模式下按 0
跳转到当前行行尾
$
普通模式下按 $
跳转到当前行第 N 个字符
`N
`
水平滚动到最左/右端
zs
/ ze
用于水平滚动的窗口或长行
🧹 删除 / 清空相关
操作
命令
使用说明
删除当前行
dd
普通模式下按 dd
删除 N 行
Ndd
例如 3dd
表示删除当前及其后两行
删除到行尾
D
/ d$
D
是 d$
的简写,删除光标至行尾
删除到行首
d0
/ d^
d0
含缩进,d^
不含缩进
删除全文
ggdG
先跳到第一行 gg
,然后 dG
删除至最后行
清空当前行
cc
删除当前行并自动进入插入模式
清空整个文件
:%d
命令模式输入,需回车
✍️ 编辑相关
操作
命令
使用说明
插入(当前光标)
i
进入插入模式,开始输入
插入(行首)
I
插入到行首的第一个非空字符前
新建行并插入(下)
o
当前行下方新建一行并进入插入模式
新建行并插入(上)
O
当前行上方新建一行并进入插入模式
替换当前字符
r<char>
例如 ra
把当前字符替换为 a
连续替换字符
R
按 R
开始替换,Esc 退出
撤销
u
撤销上一步
重做
Ctrl + r
撤销的内容重新做
粘贴(后/前)
p
/ P
p
粘贴在光标后,P
粘贴在光标前
复制当前行
yy
yank line
复制多行
Nyy
例如 3yy
复制三行
🔍 查找与替换
操作
命令
使用说明
向下查找关键字
/关键字
输入 /word
后按回车,n
/N
浏览结果
向上查找关键字
?关键字
输入 ?word
后按回车
查找下一个匹配项
n
与上次查找方向一致
查找上一个匹配项
N
与上次查找方向相反
替换当前行第一个匹配项
:s/旧/新/
命令模式输入,替换当前行首次匹配
替换当前行所有匹配项
:s/旧/新/g
当前行全替换
替换全文所有匹配项
:%s/旧/新/g
所有行替换
替换全文并手动确认
:%s/旧/新/gc
每次替换前询问确认(y
/n
)
🗂️ 文件和窗口操作
操作
命令
使用说明
保存文件
:w
命令模式输入并回车
退出
:q
如文件无更改可直接退出
强制退出
:q!
不保存直接退出
保存并退出
:wq
/ ZZ
ZZ
为普通模式下的大写 Z 两次
打开文件
:e 文件名
替换当前文件内容为指定文件
垂直选项卡分屏
:vsp 文件
垂直拆分窗口并打开文件
水平分屏
:sp 文件
水平拆分窗口并打开文件
窗口之间切换
Ctrl + w + w
依次切换当前所有窗口
其他
按下 Ctrl + C 就可以退出
按下 Ctrl + C 就可以退出
字段名
全称 / 中文名
含义 / 作用
取值范围与说明
是否越大越好
备注说明
PID
Process ID
进程的唯一标识符
系统自动分配
否
用于终止进程或定位问题
USER
用户名
拥有该进程的用户
系统用户名或登录用户
否
用于区分用户进程
PRI
Priority(优先级)
进程调度的优先级
数值越小表示优先级越高
是(越小越好)
与 NI 值相关,由内核计算
NI
nice 值
用户可调整的进程优先级
-20(最高优先)到 19(最低优先)
否
影响 PRI 值,可用 nice/renice 修改
VIRT
Virtual Memory
虚拟内存使用量
包括代码段、共享库、swap、映射文件等
否
不是实际占用内存,数值较大不一定表示问题
RES
Resident Memory
实际使用的物理内存
真正驻留在 RAM 中的内存
否
越大表示物理内存占用越多
SHR
Shared Memory
共享内存大小
与其他进程共享的内存(如共享库)
否
越大说明内存共享程度高,利用率好
S
状态(State)
当前进程状态
R(运行)、S(睡眠)、Z(僵尸)、T(停止)等
否
关注是否存在僵尸进程(Z)或长时间阻塞(D)
CPU%
CPU 占用率
当前进程使用的 CPU 百分比
多核系统可能超过 100%
是
持续高占用可能表示死循环或负载重
MEM%
内存占用率
当前进程使用的物理内存百分比
相对于系统总内存
是
用于快速找出大内存进程
TIME+
累计 CPU 时间
使用的 CPU 总时间
格式为 MM:SS.hh
是
数值大说明运行时间长,可用于判断服务长期性
Command
启动命令
启动进程时的完整命令
含路径与参数
否
有助于辨认运行程序来源
MEM
内存总览(顶部)
系统物理内存使用情况
总量、使用、缓冲、空闲
否
内存占用过高系统性能下降
SWP
交换空间(Swap)
系统 swap 使用情况
总量、使用、空闲
否
使用 swap 说明内存不足,可能导致系统变慢
1 2 sudo apt install cmatrix cmatrix
按下 Ctrl + C 就可以退出
mac终端安装cmatrix
1 2 brew install cmatrix cmatrix
如果你想让它看起来更炫,可以加一些参数,比如:
参数解释: • -b:粗体字符 • -u 10:更新速度(数字越小越快)
按下 Ctrl + C 就可以退出