常用命令

硬件

查看 CPU 信息
> more /proc/cpuinfo | grep "model name"
model name       : Intel(R) Xeon(R) CPU            X3220 @ 2.40GHz
model name       : Intel(R) Xeon(R) CPU            X3220 @ 2.40GHz
model name       : Intel(R) Xeon(R) CPU            X3220 @ 2.40GHz
model name       : Intel(R) Xeon(R) CPU            X3220 @ 2.40GHz
> grep "model name" /proc/cpuinfo
model name       : Intel(R) Xeon(R) CPU            X3220 @ 2.40GHz
model name       : Intel(R) Xeon(R) CPU            X3220 @ 2.40GHz
model name       : Intel(R) Xeon(R) CPU            X3220 @ 2.40GHz
model name       : Intel(R) Xeon(R) CPU            X3220 @ 2.40GHz
> grep "model name" /proc/cpuinfo | cut -f2 -d:
Intel(R) Xeon(R) CPU            X3220 @ 2.40GHz
Intel(R) Xeon(R) CPU            X3220 @ 2.40GHz
Intel(R) Xeon(R) CPU            X3220 @ 2.40GHz
Intel(R) Xeon(R) CPU            X3220 @ 2.40GHz
查看内存
> grep MemTotal /proc/meminfo
MemTotal:        3706476 kB

> free -m

              total        used        free      shared  buff/cache   available

Mem: 3619 3384 108 9 127 34
Swap: 3839 3236 603

> free -m |grep "Mem" | awk '{print $2}'
> 3619

> grep MemTotal /proc/meminfo | cut -f2 -d:
> 3706476 kB
> free -h
              total        used        free      shared  buff/cache   available
Mem:           3.5G        3.3G        106M        9.6M        124M         30M
Swap:          3.7G        3.2G        607M
查看系统负载
> uptime
 10:24:26 up 12 days,  3:21,  2 users,  load average: 0.08, 0.03, 0.01

load average 依次为 1、5、15 分钟的平均负载,可结合 CPU 核数判断是否过载。

> nproc                # 查看 CPU 核数
> top -bn1 | head -n 5 # 查看负载、CPU、内存概况

系统

查看 Linux 版本
> more /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
> more /etc/issue
\S
Kernel \r on an \m

> more /proc/version
> Linux version 3.10.0-1160.108.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Thu Jan 25 16:17:31 UTC 2024

查看系统版本

> cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
查看内核版本
> uname -r
2.6.18-92.1.18.el5.028stab060.2PAE
> uname -a
Linux srv.eddiechen.cn 2.6.18-92.1.18.el5.028stab060.2PAE #1 SMP Tue Jan 13 12:31:30 MSK 2009 i686 i686 i386 GNU/Linux
查看与修改主机名
> hostname                            # 查看主机名
srv.eddiechen.cn

# 永久修改主机名(CentOS 7)
> hostnamectl set-hostname srv.example.com
查看时区

查看时区

> date -R
Wed, 25 Feb 2009 02:20:50 +0000

配置时区

> mv /etc/localtime /etc/localtime.save
> cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
> date -R
Wed, 25 Feb 2009 10:24:26 +0800

或使用 timedatectl 直接设置

> timedatectl set-timezone Asia/Shanghai
> timedatectl
查看 SELinux 情况
> sestatus
SELinux status:                  disabled

临时关闭(重启后失效)

> setenforce 0

永久关闭:修改 /etc/selinux/config 中 SELINUX=disabled,重启生效。

查看命令帮助
> man ls            # 查看命令手册,q 退出
> ls --help         # 查看命令帮助
> man -k password   # 按关键字搜索手册
服务管理
> systemctl start nginx      # 启动
> systemctl stop nginx       # 停止
> systemctl restart nginx    # 重启
> systemctl reload nginx     # 重载配置(不中断服务)
> systemctl status nginx     # 查看状态
> systemctl enable nginx     # 开机自启
> systemctl disable nginx    # 取消开机自启
> systemctl is-enabled nginx # 查看是否开机自启

查看正在运行的服务

> systemctl list-units --type=service --state=running
定时任务
> crontab -l               # 查看当前用户的定时任务
> crontab -e               # 编辑定时任务
> crontab -r               # 删除当前用户的全部定时任务(慎用)
> systemctl status crond   # 确认 crond 服务已启动

格式:分 时 日 月 周 命令

# 每天 02:30 执行备份脚本,并记录日志
30 2 * * * /bin/bash /data/script/bak.sh >> /data/log/bak.log 2>&1

# 每 5 分钟执行一次
*/5 * * * * /bin/bash /data/script/check.sh
用户管理
> useradd -m -s /bin/bash deploy   # 创建用户并生成家目录
> passwd deploy                    # 设置密码
> usermod -aG wheel deploy         # 加入 wheel 组(拥有 sudo 权限)
> id deploy                        # 查看 uid、gid 及所属组
> groups deploy                    # 查看用户所属组
> userdel -r deploy                # 删除用户及家目录

> who                              # 查看当前登录用户
> w                                # 查看登录用户及其正在执行的命令
环境变量
> echo $PATH                       # 查看 PATH
> env | grep JAVA                  # 查看已设置的环境变量

# 临时生效(仅当前会话)
> export JAVA_HOME=/usr/local/jdk

# 全局永久生效(推荐放在 /etc/profile.d/ 下)
> echo 'export JAVA_HOME=/usr/local/jdk' > /etc/profile.d/java.sh
> source /etc/profile.d/java.sh
时间同步
> date                             # 查看当前时间
> timedatectl                      # 查看时间、时区、NTP 状态
> systemctl status chronyd         # CentOS 7 默认使用 chronyd
> chronyc sources -v               # 查看时间源
> chronyc tracking                 # 查看同步状态
关机与重启
> shutdown -h now      # 立即关机
> shutdown -r now      # 立即重启
> shutdown -r +10      # 10 分钟后重启
> shutdown -c          # 取消定时关机/重启
> reboot               # 重启
> poweroff             # 关机

网络

ip 地址
> ifconfig | grep 'inet addr:' | grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'
207.154.202.216

ip 命令(无需安装 net-tools)

> ip addr
> ip route          # 查看路由(默认网关)
公网 IP

可以通过 curl 访问第三方服务获取公网 IP。

  • 查询纯公网 IP:
curl ifconfig.me
  • 查询带地理位置信息的公网 IP:
curl cip.cc
网关
> cat /etc/sysconfig/network
NETWORKING="yes"
GATEWAY="192.0.2.1"
HOSTNAME="srv.eddiechen.cn"

或查看路由表

> ip route | grep default
default via 192.0.2.1 dev eth0 proto static metric 100
DNS
> cat /etc/resolv.conf
nameserver 208.74.168.131
nameserver 208.74.168.132
nameserver 4.2.2.1

测试域名解析

> nslookup www.baidu.com
> dig www.baidu.com +short
端口占用
> ss -tunlp | grep 8080        # 查看端口被哪个进程占用
> netstat -tunlp | grep 8080   # 需安装 net-tools
> lsof -i:8080                 # 需安装 lsof

# 查看指定进程占用的端口
> ss -tunlp | grep "pid=1234"
防火墙
> systemctl status firewalld                              # 查看服务状态
> firewall-cmd --state                                    # 查看防火墙状态
> firewall-cmd --list-all                                 # 查看已开放端口与服务
> firewall-cmd --add-port=8080/tcp --permanent            # 永久开放端口
> firewall-cmd --remove-port=8080/tcp --permanent         # 关闭端口
> firewall-cmd --add-service=http --permanent             # 开放服务
> firewall-cmd --reload                                   # 重新加载配置

带 --permanent 的修改需要执行 --reload 才会生效。

连通性测试
> ping -c 4 8.8.8.8                    # 测试网络连通性
> telnet 192.168.1.124 3306            # 测试端口(需安装 telnet)
> nc -zv 192.168.1.124 3306            # 测试端口(需安装 nc)
> curl -I http://192.168.1.124:8080    # 查看 HTTP 响应头
> traceroute 8.8.8.8                   # 路由追踪(需安装 traceroute)

磁盘与文件

查看磁盘和分区
> lsblk                                  # 查看磁盘与分区结构
> fdisk -l                               # 查看磁盘分区表
> df -h                                  # 查看已挂载分区的使用情况
> df -i                                  # 查看 inode 使用情况

查看磁盘剩余空间

> df -h
Filesystem             Size       Used             Avail Use      %      Mounted on
/dev/simfs              10G     353M              9.7G          4%      /

查看当前目录下文件大小

> du -sh
2.8G	  .

查看指定目录下文件大小

> du /etc -sh
38M     /etc

查看当前目录下文件大小,并按大小排序

> du -sh * | sort -hr
1.9G	dockfiles
338M	dotnet
336M	temp
118M	dotnet-sdk-3.1.426-linux-x64.tar.gz
20M	nginx-1.24.0
1.1M	nginx-1.24.0.tar.gz
4.0K	dotnet-sdk.sh
4.0K	anaconda-ks.cfg

查看当前目录下文件大小,并按大小排序,并输出文件名

> du -sh * | sort -hr | awk '{print $2}'
dockfiles
dotnet
temp
dotnet-sdk-3.1.426-linux-x64.tar.gz
nginx-1.24.0
nginx-1.24.0.tar.gz
dotnet-sdk.sh
anaconda-ks.cfg
查看文件大小
> du -sh /data/www/api/

查看文件大小并排序

> du -sh /data/www/api/* | sort -hr
挂载磁盘
> mount /dev/vdb1 /data     # 挂载
> umount /data              # 卸载
> blkid                    # 查看分区 UUID 与文件系统类型
> findmnt                   # 查看当前挂载情况

开机自动挂载:编辑 /etc/fstab 追加一行

UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /data ext4 defaults 0 0

修改后先执行 mount -a 验证,避免配置错误导致重启失败。

修改文件权限
> chmod +x *.sh
# 或者
> chmod 755 *.sh

# +x 等价于 775

权限数字含义:r=4、w=2、x=1,755 即 rwxr-xr-x。

> chmod -R 755 /data/www           # 递归修改目录及子文件
> chown -R www:www /data/www       # 修改属主与属组
> ls -l /data/www                 # 查看权限与属主
创建软链接
# 创建软链接(类似快捷方式)
> ln -s /data/app/releases/v1.0.0 /data/app/current

# 查看指向
> ls -l /data/app/current
lrwxrwxrwx 1 root root 28 Oct 27 10:24 current -> /data/app/releases/v1.0.0

# 删除软链接(末尾不要加 /,否则可能删到目标目录内容)
> rm -f /data/app/current
文件查找
> find /data -name "*.log"                  # 按名称查找
> find /data -type f -name "*.log"          # 只查找文件
> find /data -type d -name "temp"           # 只查找目录
> find /data -type f -size +100M            # 查找大于 100M 的文件
> find /data -type f -mtime -7              # 查找 7 天内修改过的文件
> find /data -type f -name "*.log" -delete  # 查找并删除
压缩与解压
# tar
> tar -czvf web.tar.gz /data/www/web    # 压缩
> tar -tzvf web.tar.gz                  # 查看压缩包内容
> tar -xzvf web.tar.gz -C /data/www     # 解压到指定目录

# zip(需安装 zip / unzip)
> zip -r web.zip /data/www/web
> unzip web.zip -d /data/www
按时间查找并拷贝
# 查找创建时间在 2024-01-01 14:00:00 之后的文件并复制
> find /srv/www/api/ -type f -newermt '2024-01-01 14:00:00' -exec cp '{}' /data/bak/api \;
# 查找创建时间在 2024-01-01 14点至 2024-01-01 15:00:00 之间的文件并复制
#find /srv/www/api/ -type f -newermt '2024-01-01 14:00:00' ! -newermt '2024-01-01 15:00:00' -exec cp -rp '{}' /data/bak/api \;
> find /srv/www/api/ -type f -newermt '2024-01-01 14:00:00' -and ! -newermt '2024-01-01 15:00:00' -exec cp '{}' /data/bak/api \;
按时间删除
# 查找创建时间在 2024-01-01 14:00:00 之前的文件压缩为 2023.tar.gz
> find . -type f ! -newermt "2024-01-01 14:00:00" -print0 | tar --null -czvf ../2023.tar.gz --files-from -

# 查找创建时间在 2024-01-01 到 2024-02-01 之间的文件压缩 为 202401.tar.gz
> find . -type f -newermt "2024-01-01" ! -newermt "2024-02-01" -print0 | tar --null -czvf ../202401.tar.gz --files-from -

# 查找创建时间在 2024-01-01 14:00:00 之前的文件并删除
> find /srv/www/api/ -type f ! -newermt '2024-01-01 14:00:00' -exec rm -rf '{}' \;

# 查找创建时间超过 365 天的文件并删除
> find /srv/www/api/ -type f -mtime +365 -exec rm -rf '{}' \;
跨服务器拷贝
# 复制本机 /srv/www/web 目录下的所有文件到 192.168.1.124:/data/www/web 的目录下
> scp -rp /srv/www/web/* root@192.168.1.124:/data/www/web

# 查找创建时间在 2024-01-01 14:00:00 之后的文件并复制
> find /srv/www/api/ -type f -newermt '2024-01-01 14:00:00' -exec scp -rp '{}' root@192.168.1.124:/data/www/api \;

# 复制并跳过已存在的文件
> rsync -avz --ignore-existing /srv/www/Api/* root@192.168.1.124:/data/www/api

进程与日志

查看程序进程
> ps -aux | grep redis
> ps -ef | grep java
进程管理
> ps -ef | grep java        # 查看进程及 PID
> top -p <pid>             # 查看指定进程的资源占用
> kill -15 <pid>           # 优雅停止(推荐)
> kill -9 <pid>            # 强制结束
> pkill -f app.jar         # 按命令行关键字结束进程

# 后台运行并输出日志
> nohup java -jar app.jar > app.log 2>&1 &
日志查找

在前 1000 行中查找 包含 getMethodList 和 f17fbc0a-8039-494f-b322 的数据

# 在前1000行中查找对应的字符串
> head -n 10000 /var/log/www/api.out.log | grep -E "getMethodList.*f17fbc0a-8039-494f-b322" -n

# 在文件中搜索对应的字符串
> grep -E '订单.*23' /var/log/www/api.out.log
实时查看日志
> tail -f /var/log/www/api.out.log          # 实时查看新增日志
> tail -n 200 -f /var/log/www/api.out.log   # 先显示最后 200 行
> tail -f /var/log/www/api.out.log | grep -E "Error|Exception"   # 实时过滤
> less +F /var/log/www/api.out.log          # 使用 less 跟随,Ctrl+C 停止
systemd 日志
> journalctl -u nginx -n 100 --no-pager     # 查看 nginx 最近 100 行日志
> journalctl -u nginx -f                    # 实时查看
> journalctl --since "2024-01-01 14:00:00" --until "2024-01-01 15:00:00"
> journalctl -p err -b                      # 查看本次启动的错误日志

软件包管理

查看已安装的软件包
> rpm -qa | wc -l
197
> yum list installed | wc -l
198

> rpm -qa | grep nginx           # 查看指定软件是否安装
> rpm -ql nginx                  # 查看软件安装的文件列表
安装、更新与卸载
> yum install -y nginx      # 安装
> yum remove -y nginx       # 卸载
> yum update -y nginx       # 更新指定软件
> yum update -y             # 更新全部软件(生产环境慎用)
> yum search nginx          # 搜索软件包
> yum info nginx            # 查看软件包信息
> yum repolist              # 查看已启用的软件源
清理与重建缓存
> yum clean all      # 清理缓存
> yum makecache      # 重建缓存

参考