磁盘管理 df、du
df命令
功能:检查文件系统的磁盘空间占用情况
-a 显示所有文件系统的磁盘使用情况,包括0块(block)的文件系统,如/proc文件系统。
-k 以k字节为单位显示。
-h 以可读性较好的方式显示。 df -h
du命令
功能:统计目录(或文件)所占磁盘空间的大小
该命令逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块(1024字节)的情况。若没有给出Names,则对当前目录进行统计。
-s 对每个Names参数只给出占用的数据块总数
-a 递归地显示指定目录中各文件及子孙目录中各文件占用的数据块数
-b 以字节为单位列出磁盘空间使用情况(系统缺省以k字节为单位)。
-k 以1024字节为单位列出磁盘空间使用情况
-c 最后再加上一个总计(系统缺省设置)。
-l 计算所有的文件大小,对硬链接文件,则计算多次
磁盘加载:mount、umount
略
df命令用来查看磁盘的使用情况。常用df -ah 或者 df -h;可以查看一级文件夹大小、使用比例、档案系统及其挂入点,但对文件却无能为力
du可以查看文件及文件夹的大小,统计文件大小相加。du命令用来查询档案或目录的磁盘使用空间,常用:du -sh 目录 或者 du -h 目录
主机名
查看主机名:hostname命令
hostname newName:可以临时更改主机名,重启后失效
hostname命令参数:
-s, --short short host name
-a, --alias alias names
-i, --ip-address addresses for the host name
hostname与/etc/hostst ; /etc/sysconfig/network的关系
hosts文件的作用相当如DNS,提供IP地址到hostname的对应。早期的互联网计算机少,单机hosts文件里足够存放所有联网计算机。不过随着互联网的发展,这就远远不够了。于是就出现了分布式的DNS系统。由DNS服务器来提供类似的IP地址到域名的对应。
第一部份:网络IP地址;
第二部份:主机名或域名;
第三部份:主机名别名;
Linux系统在向DNS服务器发出域名解析请求之前会查询/etc/hosts文件,如果里面有相应的记录,就会使用hosts里面的记录。/etc/hosts文件通常里面包含这一条记录。windows也是一样的,都会先检查本地的host
/etc/sysconfig/network文件:
此文件是针对本计算机的,是给计算机起的一个名字,是计算机的一个标识。因此要永久的修改主机名,请修改network文件
网络配置
手动设置ip地址
ifconfig <网络接口名称> network <子网掩码>
ifconfig eth0 192.168.1.222 netmask 255.255.255.0
注:手工配置linux网络只限于临时使用,配置不保存。
/etc/rc.d/init.d/network start 启动network /etc/rc.d/init.d/network stop 停止network /etc/rc.d/init.d/network restart 重启network ###修改完成后 一定要重启服务 service netword restart
ip命令
ip命令和ifconfig命令一样,但是功能更加强大,并旨在取代后者。
ip addr:可以查看所有的网卡的相关信息(包括ip地址)
ip addr show eth0:查看指定网卡eth0的相关信息
ip route show:查看路由包来自的接口(本地接口)——
netstat命令
Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态,端口使用情况等
-a (all)显示所有选项,netstat默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。(重要)
-l 仅列出有在 Listen (监听) 的服務状态(一般我们也会加上此参数)
-p 显示建立相关链接的程序名(macOS中表示协议 -p protocol)
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-c 每隔一个固定时间,执行该netstat命令。
提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到
案例:
列出所有端口: netstat -a (包含监听中的、连接中的。一般总数会有好几百个)
列出所有tcp端口: netstat -at
列出所有udp端口: netstat -au
只显示监听端口: netstat -l
显示 TCP 或 UDP 端口的统计信息 netstat -st 或 -su(使用较少)
netstat -p 可以与其它开关一起使用,就可以添加 “PID/进程名称” 到 netstat 输出中
持续输出 netstat 信息:
netstat 将每隔一秒输出网络信息。 netstat -t -c 2
查找某个端口的运行信息: netstat -an | grep ':22'
最常用的:
netstat -tunlp |grep 端口号:用于查看指定的端口号的进程情况,如查看8000端口的情况
netstat -tunlp |grep 9090
lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000
lsof(list open files)默认没有安装,若该命令没有需要安装
进程管理
在Linux系统中,每个执行的程序(代码)都称为一个进程。每一个进程都分配一个ID号
使用ps命令监控系统进程
ps命令有两种不同风格的语法规则:
最常用的为:ps -ef和ps -aux
常用参数说明:
-a:显示当前终端所有进程信息
-u:以用户的格式显示进程
-x:显示进程使用的参数
-A:显示所有进程。
-e :所有进程。等同于-A。
-f:全格式显示
-h 不显示标题。
ps 与grep 常用组合用法,查找特定进程 ps -ef |grep ssh
kill和killall
kill[参数][进程号]
kill命令可以带信号号码选项,也可以不带。如果没有信号号码,kill命令就会发出终止信号(15),这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源。也可以用kill向进程发送特定的信号。例如:
可以向多个进程发信号或终止它们。
列出所有信号名称:kill -l
只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。所以此处一般只需要记住kill -9就可以了
Linux系统中的killall命令用于杀死指定名字的进程(kill processes by name)。我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用ps等命令再配合grep来查找进程,而killall把这两个过程合二为一,是一个很好用的命令。
killall[参数][进程名]
-Z 只杀死拥有scontext 的进程
-e 要求匹配进程名称
-I 忽略小写
-g 杀死进程组而不是进程
-i 交互模式,杀死进程前先询问用户
-l 列出所有的已知信号名称
-q 不输出警告信息
-s 发送指定的信号
-v 报告信号是否成功发送
-w 等待进程死亡
–help 显示帮助信息
–version 显示版本显示
杀死所有同名进程:
killall nginx killall -9 bash
向进程发送指定信号:
killall -TERM ngixn 或者 killall -KILL nginx
备注:killall其实使用较少,因为还是非常危险的
最佳实践:T掉某个非法用户
ps -aux | grep sshd # 找到这个pId后 kill -9 pid
查看进程树pstree
pstree命令以树状图显示进程间的关系(display a tree of processes)。ps命令可以显示当前正在运行的那些进程的信息,但是对于它们之间的关系却显示得不够清晰。在Linux系统中,系统调用fork可以创建子进程,通过子shell也可以创建子进程,Linux系统中进程之间的关系天生就是一棵树,树的根就是进程PID为1的init进程。
-p:显示进程的PID
-u:显示进程的所属用户
service
服务service本质就是进程,但是是运行在后台的。通常都会监听某个端口等待其它程序的请求。比如Mysql、SSHD、防火墙等。因此这个我们又称为守护进程,是Linux非常重要的知识点
其实service的绝对路径为/sbin/service ,打开这个文件cat /sbin/service,我们会发现其实它就是一个很普通的shell脚本:
#!/bin/sh . /etc/init.d/functions VERSION="$(basename $0) ver. 0.91" USAGE="Usage: $(basename $0) < option > | --status-all | \ [ service_name [ command | --full-restart ] ]" SERVICE= SERVICEDIR="/etc/init.d" OPTIONS= if [ $# -eq 0 ]; then echo "${USAGE}" >&2 exit 1 fi cd / while [ $# -gt 0 ]; do case "${1}" in --help | -h | --h* ) echo "${USAGE}" >&2 exit 0 ;; --version | -V ) echo "${VERSION}" >&2 exit 0 ;; *) if [ -z "${SERVICE}" -a $# -eq 1 -a "${1}" = "--status-all" ]; then cd ${SERVICEDIR} for SERVICE in * ; do case "${SERVICE}" in functions | halt | killall | single| linuxconf| kudzu) ;; *) if ! is_ignored_file "${SERVICE}" \ && [ -x "${SERVICEDIR}/${SERVICE}" ]; then env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" status fi ;; esac done exit 0 elif [ $# -eq 2 -a "${2}" = "--full-restart" ]; then SERVICE="${1}" if [ -x "${SERVICEDIR}/${SERVICE}" ]; then env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" stop env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" start exit $? fi elif [ -z "${SERVICE}" ]; then SERVICE="${1}" else OPTIONS="${OPTIONS} ${1}" fi shift ;; esac done if [ -f "${SERVICEDIR}/${SERVICE}" ]; then env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" ${OPTIONS} else echo $"${SERVICE}: unrecognized service" >&2 exit 1 fi
这个命令不是在所有的linux发行版本中都有。主要是在redhat、fedora、mandriva和centos中。 service命令用于对系统服务进行管理,比如启动(start)、停止(stop)、重启(restart)、查看状态(status)等。
所以如果你执行命令:service mysqld start其实相当于执行了命令/etc/init.d/mysqld stop start
因此如果你写shell脚本为了保证兼容性,可以用完整命令代替service命令哦
开启、关闭防火墙(非常实用)
service iptables start/stop/restart
系统监控命令 top htop
Linux系统可以通过top命令查看系统的CPU、内存、运行时间、交换分区、执行的线程等信息。通过top命令可以有效的发现系统的缺陷出在哪里。是内存不够、CPU处理能力不够、IO读写过高….
第一行:这行信息与命令**uptime**显示的信息相同
10:08:45 — 当前系统时间
10 days, 3:05 — 系统已经运行了10天3小时5分钟(在这期间没有重启过)
1 users — 当前有1个用户登录系统
load average: 0.00, 0.00, 0.00 — load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
第二行:
Tasks — 任务(进程),系统现在共有135个进程,其中处于运行中的有1个,134个在休眠(sleep),stoped状态的有0个,zombie状态(僵尸)的有0个。
第三行:cpu状态
0.3% us — 用户空间占用CPU的百分比。
0.0% sy — 内核空间占用CPU的百分比。
0.0% ni — 改变过优先级的进程占用CPU的百分比
99.7% id — 空闲CPU百分比
0.0% wa — IO等待占用CPU的百分比
0.0% hi — 硬中断(Hardware IRQ)占用CPU的百分比
0.0% si — 软中断(Software Interrupts)占用CPU的百分比
在这里CPU的使用比率和windows概念不同,如果你不理解用户空间和内核空间,可以先度娘稍微了解一下。比如:应用程序崩溃不会造成内核崩溃,拿windows举例来说,QQ崩溃掉不会造成程序死机。每个应用程序或者进程都会有自己特定的地址、私有数据空间,程序之间一般不会相互影响,例如QQ崩溃不会造成微信的崩溃。空间的隔离极大地提高了系统运行的稳定性。
第四行:内存状态
3808060k total — 物理内存总量(4GB)
3660048k used — 使用中的内存总量(3.6GB)
148012k free — 空闲内存总量(148M)
359760k buffers — 缓存的内存量 (359M)
使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。
第五行:swap交换分区
4184924k total — 交换区总量(4G)
0k used — 使用的交换区总量(0M)
4184924k free — 空闲交换区总量(4G)
2483956k cached — 缓冲的交换区总量(2483M)
如果出于习惯去计算可用内存数,这里有个近似的计算公式:第四行的free + 第四行的buffers + 第五行的cached,按这个公式此台服务器的可用内存:148M+259M+2483M = 2990M。
对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
第六行是空行
第七行以下:各进程(任务)的状态监控
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)
交互命令:
ENTER或者SPACE键: 刷新显示
‘B’: 触发粗体显示(一些重要信息会以加粗字体显示。这个命令可以切换粗体显示)
‘d’ 或‘s’: 设置显示的刷新间隔 :当键下’d’或’s’时,你将被提示输入一个值(以秒为单位),它会以设置的值作为刷新间隔。如果你这里输入了6.0,top将会每秒刷新
‘R’: 反向排序
M:根据驻留内存大小进行排序。
‘c’: 切换是否显示进程启动时的完整路径和程序名。 (特别好用)
q:退出程序
k:相当于kill。后面提示出入信号和进程id