文章目录
关机和重启
1. shutdown
-c:取消已经执行的 shutdown 命令;
-h:关机;
-r:重启;
例如:
shutdown -h now # 立即关机
shutdown -h +10 # 10分钟后关机
shutdown -h 05:30 # 指定时间关机
shutdown -r now # 立即重启
2. init
关机:init 0
重启:init 6
3. 关机命令:halt 和 poweroff (直接执行)
4. 重启命令:reboot (直接执行)
防火墙相关操作
查看防火墙状态:service iptables status
如果出现:Redirecting to /bin/systemctl status iptables.service Unit iptables.service could not be found
只需执行命令:yum install iptables-services
# 停止防火墙
service iptables stop
# 启动防火墙
service iptables start
# 重启防火墙
service iptables restart
# 永久关闭防火墙
chkconfig iptables off
# 永久关闭后重启
chkconfig iptables on
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl status firewalld.service
查看ip地址信息
1. Linux下使用命令:ifconfig 或者 ip addr
2. Windows下使用命令:ipconfig 或者 ipconfig/all
网络相关操作
# 查看网络状态
service network status
# 启动网络
service network start
# 关闭网络
service network stop
du 查看文件或目录的大小
# 常用的两个选项
-s # 仅显示目录的总值
-h # 以K M G为单位显示
# 查看当前目录下的每个子目录和所有文件所占用的空间大小
du -h
# 查看某个文件的占用空间大小
du -h 文件名
# 查看当前目录所占空间总大小,不显示下面的文件夹和文件具体大小
du -sh
# 查看当前目录下的文件和文件夹占用空间大小
du -sh *
操作磁盘相关命令
查看磁盘使用信息(已挂载的磁盘才能看到):df -h
查看磁盘列表:fdisk -l
查看磁盘挂载的目录、格式化的文件系统类型,对于未进行格式化的磁盘会提示unrecognised disk label:parted -l
查看磁盘挂载信息(树形展示):lsblk
查看磁盘挂载信息(列表展示):lsblk -l
查看磁盘挂载信息(树形展示、显示文件系统类型,新磁盘是否格式化过可以通过这个命令得知):lsblk -f
格式化磁盘为ext4系统或者xfs系统:mkfs -t ext4/xfs /dev/vdb mkfs.xfs /dev/sdb
挂载磁盘(未进行格式化过的磁盘mount会失败):mount /dev/vdb /data
写入文件(否则重启挂载会失效):echo "/dev/vdb /data xfs defaults 0 0" >>/etc/fstab
关于linux磁盘空间满了的解决方案
参考文章:https://blog.youkuaiyun.com/ck3207/article/details/76691904
如果我们在创建目录的时候出现“ no space left on device ”这个提示,或者在写文件的时候出现”write error (file system full?)“这两种情况,那么第一个应该考虑的就是磁盘空间是否满了
(一般来说,大多数情况下是由于日志文件占满磁盘)
步骤:
# 1. 查看磁盘分区上磁盘空间的使用情况
df -h
# 2. 定位最大文件目录(要进入根目录/下执行以下命令)
du -h --max-depth=1
# 3. 找到占用最大空间的文件之后,确保没有使用的情况下,可以删除
rm -rf 文件名
# 4. 确认删除文件是否还被占用,如果还被占用,那么就算删了该文件,磁盘空间也不会释放
/usr/sbin/lsof|grep deleted (文件比较多,可以使用grep进行过滤)
# 5. 根据进程的pid强制杀死该进程即可释放磁盘空间
kill -9 pid
shell编程
- 在linux中,一切皆文件,因此并不以后缀名来标识文件,例如也可以创建一个名为test的文件,并非一定得是test.txt、test.sh才能算文件。
- 在linux中,虽然一切皆文件,但是对于shell脚本来说,通常会以.sh作为后缀,这是一种规范,但并非强制,换言之,shell脚本也可以是不以.sh作为结尾。
- 对于shell脚本而言,在第一行通常会指定shell脚本执行的解释器,例如"#!/bin/bash",如果没有指定,则会使用默认的解释器;执行"cat /etc/shells"可以查看当前linux系统支持的shell解释器,执行"echo $SHELL"可以查看默认的shell解释器,默认就是/bin/bash,因此如果shell脚本文件第一行没有指定使用的shell解释器,默认就是#!/bin/bash。
- linux执行shell脚本有四种方式:①bash a.sh ②sh a.sh ③./a.sh ④source a.sh 或者 . a.sh
有以下区别:
① bash a.sh 和 sh a.sh两种方式不需要文件有可执行权限也可执行,执行的时候指定了shell解释器,即使文件第一行指定了,也会以执行命令时使用的bash或者sh为准。
② 早期来说,/bin/sh和/bin/bash两种解释器的最大区别在于/bin/sh在执行脚本过程中,遇到错误会立即终止,而/bin/bash则不会,遇到错误也会继续往下执行;对于现在大多数linux系统来说,/bin/sh都是软连接指向了/bin/bash,如果想要脚本执行过程遇到错误立即终止,可以加上 "set -e"命令。
③ ./a.sh或者以绝对路径的方式执行shell脚本,都需要先赋予脚本可执行权限,否则会报权限不足。
④ source a.sh 或者 . a.sh方式同样不需要文件具备可执行权限;source(或点) 命令通常用于重新执行刚修改的初始化文档,例如/etc/profile,使其立即生效。
⑤ bash a.sh、sh a.sh、./a.sh三种方式执行shell脚本,都是在当前shell开启新的子shell进行执行,而source的方式执行则是在当前shell下执行。
ps 查看进程信息
ps -ef:查看所有进程信息(包括进程号pid和运行该进程使用的cmd命令)
ps -ef | grep 进程号:根据进程号查看某个唯一进程的详细信息
ps -ef | grep java:查看java相关进程,会显示多个与java相关的进程
ps -aux 与 ps -ef 作用相同,只不过打印的信息有所差别
举例:
ps - ef | grep java # 查看java进程的运行情况
ps - ef | grep defunct # 查看僵尸进程的运行情况
ps - ef | grep defunct | wc -l # 统计僵尸进程的数量
netstat、lsof 查看端口号
netstat -nultp # 查看所有端口的占用情况
netstat -anp | grep 端口号 # 查看某个端口的使用情况
netstat -nltp | grep 端口号 # 查看某个端口的使用情况
注:查看具体端口时候,必须要看到tcp,端口号,LISTEN那一行,才表示端口被占用了
查看端口的占用情况,被哪个进程占用了,(COMMAND指的是进程名,PID指的是进程号/进程ID)
lsof -i # 查看所有端口的占用情况
lsof -i | grep java # 查看所有被java进程占用的端口情况
lsof -i:端口号 # 查看指定端口号的占用情况
通过进程名或进程号结束占用端口的进程,解决端口冲突
killall 进程名 # 通过进程名结束占用端口的进程
kill 进程ID(PID) # 通过进程ID结束占用端口的进
kill -9 进程ID(PID) # 通过进程ID强制结束占用端口的进
总结: 查看端口号的占用情况我们可以使用netstat命令也可以用lsof命令,但是如果要解决端口冲突,也就是杀死占用端口的进程,一般会使用lsof命令+kill命令,因为lsof命令可以看到占用端口号的进程名和进程ID,kill命令便可以通过进程名或进程ID结束占用端口的进程
top 命令
top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。比如cpu、内存的使用
shift+e:切换内存显示模式(可显示为GB单位)
q退出
根据某个字段排序:f键进入字段选择、上下箭头选择字段、s键激活、q退出选择
查看内存占用最高前三:ps aux | head -1;ps aux |grep -v PID |sort -rn -k +4 | head -3
查看某个进程的内存占用情况:top -p pid
find 搜索命令
(-name:根据名称进行匹配)
例如:在根目录下查找名称为init的,注意是精准匹配
find / -name init
(还可以使用正则表达式进行模糊匹配)
例如:在根目录下查找名称带有init的,注意是模糊匹配
find / -name *init*
(-iname:根据名称进行匹配,不区分大小写)
find / -iname init
(-size:根据文件大小进行查找,+n大于、-n小于、n等于)
(单位是数据块,1KB=2数据块)
例如:在根目录下查找文件大小大于100M的
find / -size +204800
(-cmin:在指定时间内属性被修改过的,单位是分钟)
例如:查找/etc目录下在5分钟内被修改过属性的文件和目录
find /etc -cmin 5
(-amin:在指定时间内被访问过的,单位是分钟)
例如:查找/etc目录下在5分钟内被访问过的文件和目录
find /etc -amin 5
(-mmin:在指定时间内内容被修改过的,单位是分钟)
例如:查找/etc目录下在5分钟内被修改过内容的文件和目录
find /etc -mmin 5
(-type:根据类型进行查找;f代表文件、d代表目录、l代表软链接文件)
(-a:关联两个查询条件,相当于and;-o:满足其中一个条件即可,相当于or)
例如:查找/etc目录下名称为init的文件,注意只搜索文件
find /etc -name init -a -type f
(-exec/-ok 命令 {} \:对搜索的结果执行操作)
例如:查找/etc目录下名称为init的文件并显示其详细信息
find /etc -name init -a -type f -exec ls -l {} \
字符截取命令
1、grep命令
grep用于过滤出符合条件的行
选项:
-i:忽略大小写
-n:显示行号
-v:反向匹配
-a:把二进制文件当成普通文件(解决:Binary file (standard input) matches)
-q:不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试
例如:if(cat a.txt | grep -q hello) then
echo 'true' else echo 'false'
表示如果a.txt包含hello,结果输出true,否则输出false
2、cut命令
cut命令用于截取文件中指定的列,默认文件中是按照制表符进行分隔的
例如:
cut -f 1 a.txt(截取a.txt中的第一列,列与列之间用制表符分隔开)
cut -d ":" -f 1,4 a.txt(截取a.txt中的第一列和第四列,列与列之间用冒号分隔开)
cut命令通常会和grep命令配合使用,先通过grep命令过滤出指定的行,再通过cut命令提取指定的列
例如:
cat /etc/passwd | grep /bin/bash | cut -d ":" -f 1
cut命令的局限性:不能对分隔符为空格的进行截取
3、printf命令
printf命令用于格式化输出,一般与awk命令配合
命令格式:printf '输出类型输出格式' 输出内容
例如:
printf %s 1 2 3 4(结果为1234)
printf %s %s 1 2 3 4(结果为%1234)
printf '%s %'s 1 2 3 4(结果为1 23 4)
printf '%s %s\n' 1 2 3 4
(结果为
1 2
3 4)
注意:
printf命令不能接收管道符的结果进行格式化
例如:cat a.txt| printf '%s'(错误的)
正确的应该是:printf '%s' $(cat a.txt)
4、awk命令
awk命令也是进行列截取,它能实现cut命令所有功能,但是比cut命令更加复杂,awk默认是以制表符或者空格分隔
命令格式:awk '条件1{动作1} 条件2{动作2}'' 文件
awk通常和printf或者print命令配合使用,print命令会自动在每一行末尾加上换行符
例如:
df -h | awk '{printf $1 "\t" $5 "\n"}'
(指的是管道符接收df -h的结果,然后提取出第一列和第五列的内容,中间以制表符分隔,每一行末尾加上换行符,并且awk命令没有加上条件,只有{}动作,指的是对于每一行内容都生效)
awk 'BEGIN{print "this is begin:"} {print $1 "\t" $2}' a.txt
(BEGIN代表一个条件,指的是在读取文件数据之前会先执行BEGIN后面的动作,只执行一次)
awk 'BEGIN{FS=“:”} {print $1 "\t" $3}' /etc/passwd
(如果指定分隔符,要加上BEGIN,不然会导致分隔符对第一行数据不起作用)
awk 'END{print "this is end:"} {print $1 "\t" $2}' a.txt
(END代表一个条件,指的是在读取完文件数据之后会执行END的动作,只执行一次)
cat a.txt | grep -v Name | awk '$3 >= 90 {printf $2 "\n"}'
(指的是当a.txt文件中第三列的值大于等于90,那么输出第二列的值)
5、sed命令
sed命令属于轻量流编辑器,主要是用来将数据进行选取/替换/删除/新增的命令,sed命令实现的功能跟vim命令很类似,就是修改内容,但是vim命令只能对一个已存在的文件进行修改;而sed命令是可以以管道符的形式接收,然后修改
命令格式:sed 选项 '动作' 文件名
选项:
-n:sed命令会把所有数据输出到屏幕,加上-n则只会输出符合sed命令的数据到屏幕
-i:会把sed命令修改的结果写到文件中
-e:可以同时处理多条sed命令
动作:
a:追加,在当前行后追加一行或者多行,多行需要加上 \
i:插入,在当前行前插入一行或者多行,多行需要加上 \
c:行替换,替换某一行内容,替换多行需要加上 \
d:删除,删除指定的行
p:打印,输出指定的行
s:字符串替换,用一个字符串替换另一个字符串
例如:
sed '2p' a.txt
(指的是会输出文件所有内容到屏幕上,但是第二行的内容会输出两次)
sed -n '2p' a.txt
(指的是只会输出文件第二行的内容到屏幕上)
(p动作通常都得和-n选项一起使用)
df -h | sed -n '2p'
(sed命令可以接收管道符的内容,管道符和grep命令配合,通常是只能过滤出符合条件的行,但是如果只是想输出具体某一行的内容,可以结合sed命令)
sed '2,4d' a.txt
(指的是删除文件第二行到第四行的内容,只影响输出到屏幕的结果,不会对原文件做修改)
sed '2a hello' a.txt
(指的是在第二行之后追加hello字符串,只影响输出到屏幕的结果,不会对原文件做修改)
sed '2i hello \ this is me' a.txt
(指的是在第二行之前插入两行数据,第一行是hello,第二行是this is me,只影响输出到屏幕的结果,不会对原文件做修改)
sed '2c hhh' a.txt
(指的是整行替换第二行文件的内容为hhh,只影响输出到屏幕的结果,不会对原文件做修改)
sed 's/旧字符串/新字符串/g' 文件名
(指的是对某一行的某个字符串进行替换)
sed '2s/aa/bb/g' a.txt
(指的是把第二行中的aa字符串替换成bb,只影响输出到屏幕的结果,不会对原文件做修改)
sed -i '2s/aa/bb/g' a.txt
(指的是把第二行中的aa字符串替换成bb,并且把修改的结果写到原文件中)
sed -e 's/aa//g; s/cc//g' a.txt
(指的是同时把aa和cc字符串都替换为空,由于没有加行号,所以是对整个文件符合条件的进行替换)
软件包管理rpm&yum
1、rpm命令
一、rpm安装
命令:rpm -ivh 包全名(注意rpm包路径)
选项:
-i:安装
-v:显示进度
-h:显示详细信息
--nodeps:不检测依赖性
比如你这个rpm需要A,但是你没装A,这样你的包就装不上,用了--nodeps你就能装上了
二、rpm卸载
命令:rpm -e 包名(写包名即可,不需要写路径)
例如:rpm -e httpd
-v:显示进度
--allmatches:删除符合条件的所有rpm包
--nodeps:不检查依赖关系,只删除指定的包,即不会删除对应的依赖包
例如:rpm -qa | grep mariadb | xargs rpm -ev --allmatches --nodeps
三、rpm查询
命令:rpm -q 包名
选项:
-q:查询
-a:查询所有
-i:查询软件信息
-l:列表
-p:查询未安装包信息
-R:查询软件包的依赖性
例如:
rpm -q httpd(查看httpd是否安装)
rpm -qa(查看所有已安装的rpm包)
rpm -ql httpd(查看httpd的文件安装位置)
rpm -qR httpd(查询httpd依赖哪些包)
2、yum命令
yum命令是可以在线下载相关软件的rpm包并进行安装;前提是当前机器需要能够联网,
否则yum源无法下载网络上的rpm包;解决此种情况通常是给yum源配置本地镜像源,
那么通过yum命令安装软件时,将从配置的本地镜像源查找rpm包并进行安装。
挂载本地镜像源的步骤:
1、将iso镜像mount挂载到服务器上某个目录
2、在/etc/yum.reops.d下创建一个新的.repo文件,baseurl指向步骤1挂载的目录
3、执行 yum makecache 命令生成新的缓存索引文件(如果有问题,需要先执行 yum clean all 删除旧的缓存文件,再执行 yum makecache)
挂载本地镜像源使用的iso镜像最好和安装操作系统时使用的镜像保持一致,
否则在yum安装软件包过程中可能出现依赖包冲突,
原因是安装操作系统时会基于镜像下载一下基础rpm包,如果后期挂载本地镜像源使用其它iso镜像,
那么在安装某个软件包时,去到挂载的目录下载的rpm包依赖的一些基础包版本
可能跟安装操作系统时下载的版本不一致,就会出现冲突。
yum源文件所在目录:/etc/yum.reops.d,文件名以.repo作为后缀,例如:CentOS-Local.repo
yum配置文件:/etc/yum.conf
yum缓存相关数据存放目录:/var/cache/yum
(比如执行yum makecache生成的缓存文件或者yum下载的rpm包可能会缓存在这个目录下)
yum install -y vim
yum remove/autoremove vim:删除vim,autoremove则删除得更彻底,会把依赖的rpm包一起删除
yum search vim:在当前配置的yum源搜索vim软件的rpm包
yum update vim:更新vim,如果yum update后面没加软件名,则会更新所有软件
yum clean all:清除缓存目录下的软件包及旧的headers,也会把yum makecache生成的缓存文件一起删除
yum makecache:将软件包信息提前在本地索引缓存,用来提高搜索安装软件的速度
需要注意:当切换镜像源时,需要先执行yum clean all删除旧的缓存,
再执行yum makecache生成新的缓存索引文件;如果没有clean直接makecache,
并不会建立新的缓存索引文件,还是会使用旧的,那么可能出现问题。
linux中的变量
1、用户自定义变量
1. 定义一个变量:name=ccj
2. 查看变量的值:echo $name
3. 引用某个变量的值:name=${name}abc 或者 name=”$name“abc
4. 将某条命令的执行结果作为变量的值:age=$(date)
5. 删除变量:unset name
6. 查看系统所有变量:set
(包括用户自定义变量和环境变量)
注:用户自定义变量只在当前shell有效
2、环境变量
1. 定义一个环境变量:export name=ccj
2. 查看所有环境变量:env
PATH环境变量:系统查找命令的路径,以冒号分隔路径;当我们输入一条命令时,系统会去PATH环境变量定义的路径中查找是否有这条命令对应的可执行文件,有则执行,如果没有,会报错
注:环境变量会在当前shell和这个shell的所有子shell都有效;如果环境变量写入配置文件,那么会在所有shell中都生效
3、位置参数变量
1. $n:n为数字,$0代表命令本身,$1代表第一个参数,10以上的参数需要用大括号来表示,例如${10}
2. $*:代表命令行中所有参数,会把所有参数看成一个整体,当作一个字符串处理,例如把$*进行for循环,只会执行一次
3. $@:代表命令行中所有参数,会把所有参数区分对待,当作一个列表,例如把$@进行for循环,会执行多次
4. $#:代表所有参数的个数
4、预定义变量
1. $?:代表上一条命令执行成功与否,如果$?返回0,代笔上一条命令执行成功,如果返回非0,代表上一条命令执行失败
2. $$:当前进程的进程号
3. $!:后台运行的最后一个进程的进程号
关于环境变量
- linux中通过export声明环境变量,但是如果没有将环境变量写入文件,那么定义的变量只能在当前shell以及当前shell的子shell有效;如果用户开启新的shell窗口是访问不到该变量的。
- 如果要将某个变量定义为环境变量,并使其在各个shell环境都能生效,例如jdk环境变量,常见有两种方式:一是直接将环境变量写入/etc/profile文件中;二是将jdk相关环境变量单独定义在一个.sh文件里,然后移动到/etc/profile.d目录下;这样每次登录linux开启shell窗口都会读取/etc/profile中的环境变量,并且该脚本中会去执行/etc/profile.d目录下的.sh文件,使得文件中定义的环境变量都生效。
- 当我们在/etc/profile文件中定义新的环境变量,如果要使得环境变量在当前shell窗口立即生效,可以执行"source /etc/profile"命令,那么新定义的环境变量会在当前shell立即生效而不需要注销登录开启新的shell窗口。如果我们没有执行"source /etc/profile"命令,而是将当前shell窗口关闭重新开启新的shell窗口,其实就是做了一次注销并重新登录开启shell窗口的操作,那么是会自动触发/etc/profile文件的执行的。
- 关于父子shell环境变量的传递:父子shell间export变量传递方式是单向值传递(普通变量不会传递);也就是说,子shell会继承父shell的所有export定义的变量,但是子shell中定义的export变量或者修改了父shell中的export变量,是不会影响到父shell的。但是需要注意:如果一个shell脚本中通过export定义了一个变量,并且是以source的方式执行该脚本,由于source方式执行脚本是在当前shell执行的,因此脚本里面定义的export变量就对当前shell有效,即该shell脚本执行结束,也能访问到对应的export变量。
软硬连接
1、软连接
命令:ln -s 源文件 软连接文件
① 软连接会创建一个新文件,源文件和软连接文件的inode编号不同,并且软连接文件的大小和源文件大小不一致,文件大小很小,只保存了源文件名
② 修改任何一个文件内容,源文件和软连接文件都会同步变更
③ 软连接文件用ll命令查看,显示为"l",并链接指向源文件,类似于windows的快捷方式
2、硬连接
命令:ln 源文件 硬连接文件
① 硬连接不会创建新的文件,只是创建了一个新文件名,并且和源文件的inode绑定,相当于inode编号关联多个文件名,但是文件内容只有一个,因此,源文件和硬连接文件具有相同的inode编号
② 修改任何一个文件内容,源文件和硬连接文件都会同步变更
③ 硬连接文件用ll命令查看,显示为"-",就是一个文件
④ 硬连接文件的大小和源文件一致
which 命令
用于查找可执行文件的路径,它会去环境变量PATH下中查找对应的路径,例如PATH中定义了/usr/bin路径,执行“which ls”,返回的结果为/usr/bin/ls
wc 统计命令
选项:
-l:统计行数
-w:统计单词数
-m:统计字符数
例如:
wc -l a.txt
df -h | wc -l
less 文件查看命令
G:跳转到最后一页
g:跳转到第一页
上箭头:上一行
下箭头:下一行
f:下一页
b:上一页
q:退出less命令
/:搜索命令(n向后搜索,N向前搜索)
压缩解压命令
1、tar命令
解压tar.gz包:tar -zxvf xxx.tar.gz
解压到指定目录下:tar -zxvf xxx.tar.gz -C 指定目录
压缩tar.gz包:tar -zcvf
(指定压缩包名:tar -zcvf aBDI-Check-Env-ccj17090_2.2.3-08-20.tar.gz aBDI-Check-Env)
解压tar包: tar -xvf xxx.tar
2、zip&unzip命令
yum -y install zip
zip -r components.zip components
unzip components.zip
unzip components.zip -d components
service和systemctl命令
Linux服务管理有两种方式:service和systemctl。
service命令其实是去/etc/init.d目录下去执行相关服务的脚本(/etc/init.d是指向/etc/rc.d/init.d的软连接),init.d目录包含许多系统各种服务的启动和停止脚本。
service常用命令:
service nginx start 启动nginx服务
service nginx stop 停止nginx服务
service nginx status 查看nginx服务的状态
chkconfig nginx on 将nginx服务设置为开机自启动
chkconfig nginx off 将nginx服务禁止开机自启动
systemctl命令其实是去/usr/lib/systemd/system目录下查找对应服务的.service文件(例如nginx.service),通过该脚本控制服务的启动与停止。
有些服务安装之后会自动帮我们在该目录下创建对应的.service文件,方便我们通过systemctl统一管理。
我们也可以将自定义服务添加到systemctl进行统一管理,可参考:https://wiki.miyond.com/?p=477
systemctl常用命令:
systemctl start nginx 启动nginx服务
systemctl stop nginx 停止nginx服务
systemctl status nginx 查看nginx服务的状态
systemctl enable nginx 将nginx服务设置为开机自启动
systemctl disable nginx 将nginx服务禁止开机自启动
expect命令
需要先安装expect:yum -y install expect
mysql_password='Root@123'
# 注意:如果send命令中的sql语句包含双引号,需要加反斜杠进行转义
# 例如:send "update test set name = \"xiaoming\";\n"
expect <<!
spawn mysql -uroot -p
expect "*password*"
send "${mysql_password}\n";
expect "*>"
send "CREATE DATABASE test DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;\n"
send "use test;\n"
send "source init-table.sql;\n"
send "exit\n"
expect eof
!