1 |
hostname |
hostname,顾名思义,就是 host name,主机名称的意思,其实就是 @ 符号右边的内容,比如我们连上服务器后,shell 窗口里最左边一般是 [root@xxx ~]#,root 表示当前登录的账号,@ 符号右边就是主机名,再然后是当前所在目录(~ 表示家目录),最后是命令提示符,# 符号是 root 用户的,$ 符号是普通用户的。
1 |
uname -r |
uname,是 unix name 的缩写。
1 |
cat /etc/redhat-release |
cat,是 concatenate 的缩写。
1 |
cat /etc/centos-release |
cat,是 concatenate 的缩写。
1 |
lscpu |
或
1 |
cat /proc/cpuinfo |
可查看 CPU 架构、核数等信息。
lscpu,是 list cpu 的缩写。
1 |
lsblk |
lsblk 是 list block 的缩写,默认情况下将以树状结构列出所有可用块设备,可以看到每个块设备的容量大小及对应的挂载点等信息。
1 |
df -h |
df,是 disk free 的缩写,可以看到具体文件系统的容量、可用容量、已用容量占比、挂载点等信息。
1 |
free -h |
free 命令显示系统已使用和空闲的内存情况,包括物理内存、交互区(swap)内存和内核缓冲区(buff/cache)内存。从应用程序的角度来说,可用内存 = 系统 free memory + buff + cache,buff/cache 如果很大导致应用被系统杀死,可以手动清理它,如下所示——
1 2 |
sync;sync;sync sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches' |
先运行 3 个 sync 命令进行数据同步,避免数据丢失,再运行清理下面的 buff/cache 命令即可。
1 |
du -hd1 / |
du,是 disk usage 的缩写,它与上面的 df 命令并不相同。-h 选项表示以适合人类阅读的格式展示结果,-d 选项表示最多再往下查找几层子目录,后面跟个 1 就表示查找当前目录以及当前目录子目录这两级目录,最后跟上要查看的目标目录或文件。上面的命令意思就是查查看根目录 / 本身及其一级子目录、文件的空间占用情况。
1 |
date |
date 命令可查看服务器当前时间, CST 表示是中国标准时间,如果显示了 UTC(协调世界时) 或 GMT(格林尼治标准时间),则需要修改,也就是要同步网络时间。
目前比较常用的做法是使用 ntpdate 命令来同步时间,ntp 是 Network Time Protocol(网络时间协议)的缩写,这个命令在服务器上需要额外安装一下——
1 2 3 4 5 6 7 8 |
# 安装 ntpdate yum -y install ntpdate # 同步网络时间 ntpdate -u cn.pool.ntp.org # 同步完成后,再用 date 命令查看下时间是否正确 date # 将系统时间写入硬件时间,重启也不会失效 hwclock --systohc |
同步时间后可能部分服务器过一段时间又会出现偏差,因此最好设置 crontab
来定时同步时间,方法如下——
1 2 3 4 5 6 7 8 |
# 安装 crontab yum -y install crontab # 创建 crontab 任务 crontab -e # 添加定时任务 */20 * * * * /usr/****in/ntpdate cn.pool.ntp.org > /dev/null 2>&1 # 重载 crontab systemctl reload crond |
上面的计划任务会在每 20 分钟进行一次时间同步,注意上面的 ntpdate 命令路径是 /usr/****in/ntpdate,真实项目上不一定是这个路径,可以用 which ntpdate
命令查下具体的路径。
1 |
timedatectl status |
上述命令用来查看服务器当前时区,如果 Time zone 那一行没显示 Asia/Shanghai (CST,+0800) ,就表示不是中国时区,需要修改。
执行下面的命令设置时区——
1 2 3 4 |
# 设置硬件时钟调整为与本地时钟一致 timedatectl set-local-rtc 1 # 设置时区为上海 timedatectl set-timezone Asia/Shanghai |
1 |
ip a |
ip a 是 ip address 的缩写,可以查看服务器的内网 IP 地址。服务器默认网卡一般是 eth0,所以 eth0 的 inet 地址就代表内网 IP 地址,一般是 10.x.x.x 或 172.x.x.x 或 192.x.x.x 这 3 类私有地址格式。如果服务器上有 docker 容器,应该还能看到一个叫 docker0 的(虚拟)网卡,其 inet 地址可以作为宿主机的 IP 地址被容器所使用。
1 |
curl cip.cc |
或
1 |
curl myip.ipip.net |
curl,是 command url 的缩写,通过命令行访问 url 的意思。有些服务器的公网出口 IP 可能不固定,所以最好是用这两个命令都查一下,以便比对结果是否一致。另外要注意,服务器的公网出口 IP 和公网入口 IP 并不总是一致的。
1 |
systemctl status firewalld |
firewalld 是 CentOS7 系列使用的防火墙(作为系统服务),取代了 CentOS 6 系列的 iptables 防火墙。上面这个命令执行后如果显示 running,表示防火墙已开启,显示 dead,则表示防火墙已关闭。
1 |
sudo firewall-cmd --add-port=13120/tcp --permanent |
firewalld 防火墙添加规则,允许到本机 13120 端口的 TCP 连接,永久生效。想加其他端口修改 13120 即可。不允许某个端口的话,把 add 换成 remove 即可。
1 |
sudo firewall-cmd --reload |
firewalld 防火墙重载规则,—reload 就是重载的意思。重载之后,添加、删除等操作,才能真正生效。
1 |
sudo firewall-cmd --list-ports |
查看 firewalld 防火墙已开放的所有端口。
1 |
cat /etc/resolv.conf |
/etc/resolv.conf 是服务器的 DNS 配置文件,我们只需要关注它里面的 nameserver 关键字。nameserver 后面要跟上一个 IP 地址,两者之间以一个空格分隔开来。IP 一般要配成公网 IP 地址,比如 114.114.114.114 或 223.5.5.5(阿里的)或 119.29.29.29(腾讯的)。如果在服务器上 ping 这些 IP 能通,但 curl 某某域名却显示「未知的名称或服务」,那就可以在这份配置文件的最下面追加一行,比如 nameserver 114.114.114.114
。
/etc/hosts 是服务器的 hosts 配置文件,服务器在访问某个域名时,会先到这个文件里查找有没有配置该域名及对应的 IP,如果有,就直接跟对应的 IP 建立连接。如果没有,才会访问 DNS 服务器(/etc/resolv.conf 文件里配置的 nameserver)以确定对应的 IP。所以,如果在 /etc/hosts 文件里配置了我们的项目域名,就会省去一次查询 DNS 服务器解析记录的时间,因此配置服务器的 hosts 解析记录是十分有必要的。通常来说,我们需要在应用服务器上的 hosts 配置文件里(Windows 的 hosts 文件路径是 C:\Windows\System32\drivers\etc\hosts),添加一条项目域名到 nginx 服务器内网 IP 地址的解析记录,比如 10.0.4.15 hlwyy.abc.com
,其中 10.0.4.15 是 nginx 服务器的内网 IP,hlwyy.abc.com 是项目域名,中间以空格分隔,要注意应用服务器与 nginx 服务器,内网间必须双向互通。
首先重点说明一下,ping 是基于 ICMP 协议(Internet Control Message Protocol,互联网控制消息协议)的,属于 OSI 模型的网络层,它既可以 ping 域名(ping 域名可以用来测试这个域名解析的 IP 地址是多少),也可以 ping IP,但是跟端口没任何关系,请不要在 ping 域名或 ping IP 后面加任何端口!ping 通常用来测试网络连通性,如果目标地址关闭了 ICMP 协议就 ping 不通它,大家不要大惊小怪认为这个有问题,这是很正常的情况。
telnet 属于应用层,是 TCP/IP 协议族的其中之一,既然是应用层就跟端口有关系了,所以 telnet 域名或 telnet IP 后面要跟上端口(用空格分隔开来,注意不是用英文的冒号来分隔),比如——
1 |
telnet open.zwjk.com 443 |
或
1 |
telnet 115.159.1.60 443 |
telnet 通常用来测试应用是否还在运行,比如测试 nginx 服务是否还在运行,在本机上可以用 telnet 127.0.0.1 443
,在其他服务器上可以用 telnet 10.0.4.15 443
(假设 10.0.4.15 是 nginx 服务器的内网 IP)。
说几个常用服务的端口——
1 |
ps -ef|grep xxx |
ps,是 process status 的缩写,用来列出系统中当前运行的那些进程,它提供的结果并不动态连续,如果想对进程实时监控,应该用 top 命令。
我们可以根据进程名称去搜索进程,也可以根据进程 ID 去搜索进程,所以上面的 xxx 既可以是名称,也可以是 ID。
Linux 上的进程有 5 种状态,运行、中断、不可中断、僵死、停止,对应的状态码是 R、S、D、Z、T。
1 |
lsof |
lsof,list open files,是一个列出当前系统打开文件的工具(可能需要用 yum install -y lsof 命令安装一下),通常我们使用命令用来查看是否有对应端口被占用及连接到此端口上的网络连接,比如——
1 |
lsof -i:443 |
就表示查看本机上是否有进程在使用 443 端口。如果在结果里能看到 (LISTEN) ,就表示本机有进程正在占用 443 端口。如果还能看到 (ESTABLISHED) 或 (CLOSE_WAIT) 这样的,就表示有其他目标主机有到本机 443 端口的连接。
如果我们用 lsof -i:xxx 找到了一个状态是 LISTEN 的进程,假设它的进程 ID(也就是 PID 那一项)是 4937,那可以用以下命令查看该进程的当前工作目录(cwd)与执行文件路径(exe),这样可以有助于我们分析该进程到底是什么进程——
1 |
ll /proc/4937|grep cwd |
与
1 |
ll /proc/4937|grep exe |
除了 lsof,我们通常还会使用 netstat 命令(可能需要用 yum install -y net-tools 命令安装一下),用于显示各种网络相关信息,如网络连接等。
1 |
netstat -tuanlp|grep 443 |
上面这个命令可以查看当前所有连接到 443 端口(不管是本地的 443 还是远程的 443,不管是 TCP 还是 UDP)、且正处于监听状态的进程(会显示出进程 ID 和进程名称),这对我们确认服务器当前的网络连接情况是否健康是很有用的。
比如我们可以用下面的命令来查看服务器当前各个状态的网络连接数——
1 |
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}' |
它会显示例如下面的信息:
1 2 3 4 5 6 |
TIME_WAIT 814 CLOSE_WAIT 1 FIN_WAIT1 1 ESTABLISHED 634 SYN_RECV 2 LAST_ACK 1 |
其中 ESTABLISHED
表示正在通信,TIME_WAIT
表示主动关闭,CLOSE_WAIT
表示被动关闭。服务器上出现大量 TIME_WAIT 状态的连接时,可以考虑优化一下系统内核参数,出现大量 CLOSE_WAIT 状态的连接时,需要从代码层面去排查连接没有关闭的原因,总之这两种状态的连接过多时,会有很大的问题。
1 2 3 4 5 6 7 |
$ docker search $KEY_WORD # 查找镜像 $ docker pull $REGISTRY:$TAG # 拉取镜像 $ docker push $IMAGE_NAME:$IMAGE_TAG # 推送镜像到仓库,需要先登录 $ docker login $REGISTRY_URL # 登录仓库 $ docker logout $REGISTRY_URL # 退出仓库 $ docker info # 显示 Docker 详细的系统信息,可查看仓库地址 $ docker --help # 显示 Docker 的帮助信息 |
1 2 3 4 5 6 7 8 9 10 |
$ docker images # 查看本地镜像 $ docker rmi $IMAGE_ID # 删除本地镜像 $ docker inspect $IMAGE_ID # 查看镜像详情 $ docker save $IMAGE_ID > 文件路径 # 保存镜像为离线文件 $ docker save -o 文件路径 $IMAGE_ID # 保存镜像为离线文件 $ docker load < 文件路径 # 加载文件为 docker 镜像 $ docker load -i 文件路径 # 加载文件为 docker 镜像 $ docker tag $IMAGE_ID $NEW_IMAGE_NAME:$NEW_IMAGE_TAG # 修改镜像 TAG $ docker run 参数 $IMAGE_ID $CMD # 运行一个镜像 $ docker history $IMAGE_ID # 显示镜像每层的变更内容 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ docker exec $CONTAINER_ID # 在运行的容器中执行命令 $ docker attach $CONTAINER_ID # 启动一个已存在的 docker 容器 $ docker stop $CONTAINER_ID # 停止 docker 容器 $ docker start $CONTAINER_ID # 启动 docker 容器 $ docker restart $CONTAINER_ID # 重启 docker 容器 $ docker kill $CONTAINER_ID # 强制关闭 docker 容器 $ docker pause $CONTAINER_ID # 暂停容器 $ docker unpause $CONTAINER_ID # 恢复暂停的容器 $ docker rename $CONTAINER_ID # 重命名 docker 容器 $ docker rm $CONTAINER_ID # 删除容器 $ docker logs $CONTAINER_ID # 查看 docker 容器的运行日志,确保正常运行 $ docker inspect $CONTAINER_ID # 查看 docker 容器的属性,比如 ip、网络、目录挂载等 $ docker port $CONTAINER_ID # 查看 docker 容器的端口映射 $ docker top $CONTAINER_ID # 查看 docker 容器中正在运行的进程 $ docker commit $CONTAINER_ID $NEW_IMAGE_NAME:$NEW_IMAGE_TAG # 将 docker 容器保存为镜像 $ docker ps -a # 查看所有 docker 容器 $ docker stats # 查看 docker 容器的资源使用情况 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# -d,后台运行容器,并返回容器 ID;不指定时,启动后开始打印日志,Ctrl+C 退出会关闭容器 # -i,以交互模式运行容器,通常与 -t 同时使用 # -t,为容器重新分配一个伪输入终端,通常与 -i 同时使用 # --name container_name,设置容器名称,不指定时随机生成 # -h container_hostname,设置容器的主机名,默认随机生成 # --dns 8.8.8.8,指定容器使用的 DNS 服务器,默认和宿主机一致 # -e docker_host=172.17.0.1,设置环境变量 # --cpuset="0-2" or --cpuset="0,1,2",绑定容器到指定 CPU 运行 # -m 100M,设置容器使用内存最大值 # --net bridge,指定容器的网络连接类型,支持 bridge/host/none/container 四种类型 # --ip 172.18.0.13,为容器指定固定 IP(需要使用自定义网络) # --expose 8081 --expose 8082,开放一个端口或一组端口,会覆盖镜像设置中开放的端口 # -p [宿主机端口]:[容器内端口],宿主机到容器的端口映射,可指定宿主机的要监听的 IP,默认为 0.0.0.0 # -P,注意是大写的,宿主机随机指定一组可用的端口映射容器 expose 的所有端口 # -v [宿主机目录路径]:[容器内目录路径],挂载宿主机的指定目录(或文件)到容器内的指定目录(或文件) # --add-host [主机名]:[IP],为容器 hosts 文件追加 host,默认会在 hosts 文件最后追加[主机名]:[容器IP] # --volumes-from [其他容器名],将其他容器的数据卷添加到此容器 # --link [其他容器名]:[在该容器中的别名],添加链接到另一个容器,在本容器 hosts 文件中加入关联容器的记录,效果类似于 --add-host |
scp 命令允许从一台 Linux 服务器安全复制文件或目录到另外一台远程 Linux 服务器(前提是网络要通),省去了先下载到本地再上传到远程服务器这一环节,命令如下——
1 2 3 4 5 6 7 8 |
# 复制文件 scp local_file remote_username@remote_ip:remote_folder # 或者 scp local_file remote_username@remote_ip:remote_file # 或者 scp local_file remote_ip:remote_folder # 或者 scp local_file remote_ip:remote_file |
如果本机和远程主机的用户名一样,就不需要 remote_username@ 这一部分。
1 2 3 4 |
# 复制目录 scp -r local_folder remote_username@remote_ip:remote_folder # 或者 scp -r local_folder remote_ip:remote_folder |
-r 是递归复制的意思。
如果远程地址在前,本地地址在后,那就是从远程复制到本地。
sz 命令是利用 ZModem 协议来从 Linux 服务器传送文件到本地,一次可以传送一个或多个文件。相对应地,从本地上传文件到 Linux 服务器,可以使用 rz 命令。这两个命令,都要在 Linux 服务器上运行,s 代表 send,r 代表 receive。如果找不到这两个命令,需要用 yum install -y lrzsz 命令安装下。sz 命令默认会将服务器上的文件发送到本机的下载目录,运行 rz 命令则会弹出一个文件上传窗口,需要对 SecureCRT 或 Xshell 做一下设置。
which 命令用于查看可执行文件(可执行文件可以简单理解成命令,比如 cd 命令)的位置,whereis 命令用于查看文件(包括可执行文件、源代码文件、帮助文件等)的位置。
1 2 |
which cd whereis -b cd |
-b,代表二进制执行文件。
服务器上不总是自带 zip 与 unzip 命令,可以用 yum install -y unzip zip 命令安装下。大家如果用 vim 命令打开 jar 包时报错,提示类似于 error (zip#Write) sorry, your system doesn’t appear to have the zip pgm 这样的,就是因为服务器上还未安装 zip 和 unzip,因为 jar 包其实就是一种压缩文件,是需要解压才能进入的。当然,如果 vim 命令都没有,那就要用 yum install -y vim 先装一下。
history 命令用于展示使用过的历史命令,每个历史命令前面有个数字编号,我们可以输入英文叹号加数字编号,来再次运行这个历史命令。
在 Linux 服务器的 shell 里运行命令时,按 Ctrl+A 可快速回到行首,按 Ctrl+E 可快速回到行尾。
在 Vim 编辑模式(按 i 进入的就是编辑模式)中,连按两个字母 G 可快速回到第一行,按 Shift+G 可快速回到最后一行,按 Home 快速回到行首,按 End 可快速回到行尾。在 Vim 正常模式(使用 vim 命令后,默认的模式)中,按 Ctrl+U 可向上滚动半屏,按 Ctrl+D 可向下滚动半屏。
在 Vim 底线命令模式(按 : 进入的就是底线命令模式,意思就是在最底一行输入命令)中,输入 %s/aaa/bbb/g 后再按回车,就可以把当前用 vim 打开的文件里的所有 aaa 字符串全局批量替换成 bbb 字符串,然后再按冒号并输入 wq(再按冒号并输入 wq 也可以换成按键盘 Shift+zz )保存文件即可。