赞
踩
文件操作(touch、cp、mv、cat、tac、more、less、grep、wc、vim)
环境搭建
第一种方式:直接安装Linux操作系统 (会替换掉现有系统)
第二种方式:本机电脑安装成双系统 (windos linux)
第三种方式:虚拟机(VMware下载(360一键安装))
[注]虚拟机搭建环境有两种方式:
a. 下载镜像进行安装
b. 可以使用他人已制作好的镜像
安装VMware虚拟机软件好后打开镜像即可使用
第四种方式:购买云服务器 (有经济来源的话可以购买阿里云服务器,因为这才是最接近公司中原生环境的)
环境搭建(Vmware)
安装Vmware
创建虚拟机
创建新的虚拟机
选择自定义(高级)
VMware建立虚拟机分为典型(快速)和自定义(高级)两种方式
选择硬件的兼容性
选择安装创建的虚拟机的操作系统
选择你所要安装的客户机操作系统
选择操作系统的版本
更改虚拟机的名称和存放的位置
选择虚拟机具备的引导设备类型
指定处理器数量
为虚拟机预设多少内存
选择虚拟机的网络类型
配置本机网络适配器环境
进入 “控制面板”——“网络和Internet”——“更改适配器设置”
选择VMnet8是配置器,右键选择“属性”,选择“Ipv4”,如下图:
配置Vm网络连接
进入虚拟网络编辑器
由于安装VMware虚拟机后是没有网络的,因此我们还需要手动对VMware虚拟机配置网络,选择虚拟机左上方的“编辑–>虚拟网络编辑器”
配置虚拟网络地址
VMnet信息 (虚拟机网络信息)
桥接模式
需要依赖外部网络环境,VMware 虚拟出来的操作系统就像是局域网中的一台独立的主机,需要手工为虚拟系统配置IP地址,虚拟机的ip必须和宿主机(Windows)的ip是同一个网段。相当于虚拟机和主机就好比插在同一台交换机上的两台电脑,虚拟机需要占用一个真实ip
NAT模式
使用 NAT 模式,就是让虚拟系统借助 NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网,如果主机能够正常上网,那么虚拟机也能够直接上网。此时虚拟机处于一个新的网段内,由VMware提供的DHCP服务自动分配IP地址,然后通过VMware提供的NAT服务,共享主机实现上网, 不依赖外部网络环境
仅主机模式
该模式下,虚拟网络是一个全封闭的网络,它唯一能够访问的就是主机,当然多个虚拟机之间也可以互相访问, 但是仅主机模式虚拟机是无法上外网的
修改对应的虚拟机镜像的网络环境
找到你需要修改的虚拟机,右键找到“设置”选项,将虚拟机的网络适配器修改为NAT模式,然后保存
修改centos7里边配置网络环境
基本结构
第一列共有10个位置,第一个字符指定了文件类型,从第二个字符开始到第十个共9个字符,3个字符一组,分别表示了3组用户对文件或者目录的权限。
所有者权限:所有者一般是文件或目录的创建者
第一组[rwx]:属主权限,代表该文件的所有者拥有该文件的权限
第二组[rwx]:属组权限,代表所有者的同组用户拥有该文件的权限
第三组[rwx]:其他用户权限,代表其他用户所拥有该文件的权限
文件类型:
类型 | 内容 |
---|---|
[d] | 目录 |
[-] | 非目录的文件 |
[l] | 链接文档[link file] |
[b] | 装置文件内可供存储的接口设备(可随机存取装置) |
[c] | 装置文件内串行端口设备,如键盘(一次性读取装置) |
权限字符:
字符 | 内容 |
---|---|
[-] | 空许可(没有权限) |
[r] | 只读(read) |
[w] | 写(write) |
[x] | 可执行(execute) |
账号管理
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。每个用户账号都拥有一个唯一的用户名和各自的口令。
用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。
实现用户账号的管理,要完成的工作主要有如下三个方面:
用户账号的添加、删除、修改
用户账号的添加(useradd)
添加用户账号就是在系统中创建一个新账号,然后为新账号分配用户名、用户组、主目录和登录 Shell等资源
#添加账号
useradd 选项 用户名
用户账号的删除(userdel)
删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还删除用户的主目录。删除命令删除用户在系统文件中(主要是/etc、/etc/shadow…)
#删除已有用户的时候将它的目录页一并删除
userdel -r [文件名]
用户账号的修改(usermod)
#常用选项-c/d/m/g/G/s/u/o
usermod -d [文件名]
用户口令的管理(su)
#切换用户 su 用户名 #切换用户后使用新用户的工作环境 su - 用户名 #切换到root用户 sudo su #退回原来用户 exit #退回原来用户 logout #退回原来用户,其实也是执行的eixt命令 ctrl + d
查看系统用户信息
作为系统管理员,你可能经常会(在某个时候)需要查看系统中有哪些用户正在活动。有些时候,你甚至需要知道他(她)们正在做什么。本文为我们总结了4种查看系统用户信息(通过编号(ID))的方法。
查看登录用户正在使用的进程信息(w)
w命令用于显示已经登录系统的用户的名称,以及他们正在做的事。该命令所使用的信息来源于/var/run/utmp文件。w命令输出的信息包括:
• 用户名称
• 用户的机器名称或tty号
• 远程主机地址
• 用户登录系统的时间
• 空闲时间(作用不大)
• 附加到tty(终端)的进程所用的时间(JCPU时间)
• 当前进程所用时间(PCPU时间)
• 用户当前正在使用的命令
w命令还可以使用以下选项
• -h忽略头文件信息
• -u显示结果的加载时间
• -s不显示JCPU, PCPU, 登录时间
查看登录用户信息(who)
who命令用于列举出当前已登录系统的用户名称。其输出为:用户名、tty号、时间日期、主机地址。
[注]使用whoami命令查看你所使用的登录名称
查看曾经使用过系统的历史用户信息(who)
last命令可用于显示特定用户登录系统的历史记录。如果没有指定任何参数,则显示所有用户的历史信息。在默认情况下,这些信息(所显示的信息)将来源于/var/log/wtmp文件。该命令的输出结果包含以下几列信息:
• 用户名称
• tty设备号
• 历史登录时间日期
• 登出时间日期
• 总工作时间
用户账号授权(sudo)
简单的说,sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作,而不需要知道 root 的密码。
严谨些说,sudo 允许一个已授权用户以超级用户或者其它用户的角色运行一个命令。当然,能做什么不能做什么都是通过安全策略来指定的。sudo 支持插件架构的安全策略,并能把输入输出写入日志。第三方可以开发并发布自己的安全策略和输入输出日志插件,并让它们无缝的和 sudo 一起工作。默认的安全策略记录在 /etc/sudoers 文件中。而安全策略可能需要用户通过密码来验证他们自己。也就是在用户执行 sudo 命令时要求用户输入自己账号的密码。如果验证失败,sudo 命令将会退出。(注意,本文介绍的 sudo 命令运行在 ubuntu 14.04中。)
sudo命令还可以使用以下选项
• -b 在后台执行指令
• -h 显示帮助
• -H 将HOME环境变量设为新身份的HOME环境变量
• -k 结束密码的有效期限,也就是下次再执行sudo时便需要输入密码
• -l 列出目前用户可执行与无法执行的指令
• -p 改变询问密码的提示符号
• -s 执行指定的shell
• -u <用户> 以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份
• -v 延长密码有效期限5分钟
• -V 显示版本信息
• -S 从标准输入流替代终端来获取密码
sudo 程序相关文件如下
• /etc/sudoers
• /etc/init.d/sudo
• /etc/pam.d/sudo
• /var/lib/sudo
• /usr/share/doc/sudo
• /usr/share/lintian/overrides/sudo
• /usr/share/bash-completion/completions/sudo
• /usr/bin/sudo
• /usr/lib/sudo
现在了解了这些概念后下一步是进行基本配置:
系统默认创建了一个名为 sudo 的组。只要把用户加入这个组,用户就具有了 sudo 的权限。
至于如何把用户加入 sudo 组,您可以直接编辑 /etc/group 文件,当然您得使用一个有 sudo 权限的用户来干这件事:
$ sudo vim /etc/group
在 sudo 组中加入新的用户,要使用逗号分隔多个用户。
或者您可以使用 usermod 命令把用户添加到一个组中:
$ sudo usermod -a -G sudo jack
上面的设置中我们把用户 jack 添加到了 sudo 组中,所以当用户 jack 登录后就可以通过 sudo 命令以 root 权限执行命令了!
[拓展]详细配置
在前面的配置中我们只是把用户 jack 加入了 sudo 组,他就具有了通过 root 权限执行命令的能力。
现在我们想问一下,这是怎么发生的?是时候介绍如何配置 sudo 命令了!
sudo 命令的配置文件为 /etc/sudoers。
编辑这个文件是有单独的命令的 visudo(这个文件我们最好不要使用 vim 命令来打开),是因为一旦你的语法写错会造成严重的后果,这个工具会替你检查你写的语法,这个文件的语法遵循以下格式:
who where whom command
说白了就是哪个用户在哪个主机以谁的身份执行那些命令,那么这个 where, 是指允许在那台主机 ssh 连接进来才能执行后面的命令,文件里面默认给 root 用户定义了一条规则:
root ALL=(ALL:ALL) ALL
• root 表示 root 用户
• ALL 表示从任何的主机上都可以执行,也可以这样 192.168.100.0/24
• (ALL:ALL) 是以谁的身份来执行,ALL:ALL 就代表 root 可以任何人的身份来执行命令
• ALL 表示任何命令
那么整条规则就是 root 用户可以在任何主机以任何人的身份来执行所有的命令。
现在我们可以回答 jack 为什么具有通过 root 权限执行命令的能力了。打开 /etc/sudoers 文件:
sudo 组中的所有用户都具有通过 root 权限执行命令的能力!
再看个例子
nick 192.168.10.0/24=(root) /usr/sbin/useradd
上面的配置只允许 nick 在 192.168.10.0/24 网段上连接主机并且以 root 权限执行 useradd 命令。
现在设置 sudo 时不需要输入密码
执行 sudo 命令时总是需要输入密码事件很不爽的事情(抛开安全性)。有些应用场景也需要在执行 sudo 时避开输入密码的交互过程。
那么需要如何设置呢?其实很简单,只需要在配置行中添加 NOPASSWD: 就可以了:
****** ALL=(ALL) NOPASSWD: ALL
再试试看,是不是已经不需要输入密码了?
在 ubuntu 中,sudo 的日志默认被记录在 /var/log/auth.log 文件中。当我们执行 sudo 命令时,相关日志都是会被记录下来的。比如下图中显示的就是一次执行 sudo 命令的日志:
用户组管理
将用户分组是Linux系统对用户进行管理及控制访问的一种手段。用户组的所有信息都存放在/etc/group文件中。此文件的格式也类似于/etc/passwd文件,由冒号(:)隔开若干个字段,这些字段有(组名:口令:组标识号:组内成员用户列表)
a. 组名是用户组的名称,由字母或数字构成。与/etc/passwd中的登录名一样,组名不应重复
b. 口令字段存放的是用户组加密后的口令字。一般linux系统的用户组都没有口令,即这个字段一般为空,或者是*
c. 组标识号与用户标识号类似,也是一个整数,被系统内部用来标识组
d. 组内用户列表是属于这个组的所有用户的列表,不同用户之间用(,)分隔。这个用户组可能是用户的主组,也可能是附加组
每个用户都属于某个用户组,一个组中可以有多个用户,一个用户可以属于不同的组
当一个用户同时是多个组中成员时,在etc/passwd文件中记录的是用户所属的主组,也就是登录时所属的默认组,而其他组称为附加组,用户要访问附加组的文件时,必须首先使用newgrp命令使自己成为所要访问的组中的成员
完成用户的管理工作有许多办法,但是每种办法实际都是对有关系统文件进行修改
命令 | 内容 |
---|---|
groupadd [用户组] | 创建用户组 |
groupadd -g [数字] [用户组] | 创建用户组并设置id |
groupdel [用户组] | 删除用户组 |
getent group | 查看系统全部组信息 |
#修改旧用户名为新用户名且设置id group -g [数字] -n [新用户组] [旧用户组] #修改用户组的组标识号 groupmod -g [数字] 用户组 #将旧用户组名修改为新的,并标识号改1000 groupmod -g 1000 -n 新用户组名 旧用户组名 #切换[root]用户组 newgrp root #查看group文件中组信息 cat /etc/group #查看所有用户信息 cat /etc/passwd
开机关机
开机登录
方式一 : 命令行登录
方式二 : ssh登录
方式三 : 图形界面登录
[注]开机会启动许多程序。它们在windows中叫"服务"(service),在linux中叫"守护进程"(daemon)
关机(shutdown)
在Linux领域内大多用在服务器上,很少遇到关机的操作,不管是重启还是关闭系统,首先要运行sync命令,把内存中的数据同步到磁盘中.
使用关机指令,可以man shutdown 来看一下帮助文档。
#立即关机
shutdown -h now
#计算机将在10分钟后关机
shutdown -h 10
#10分钟后关机
shutdown -h +10
#系统会在今天20:25关机
shutdown -h 20:25
#关机,等同于 shutdown -h now 和 poweroff
halt
重启
#系统立即重启
shutdown -r now
#系统10分钟后重启
shutdown -r +10
#重启,等同于 shutdown -r now
reboot
目录管理(mkdir、mv)
增删移查命令(mkdir、rmdir、rm、mv、cp)
命令 | 描述 |
---|---|
pwd | 显示当前所在的目录 |
mkdir 目录 | 创造目录 |
mkdir -p 目录1 目录2 目录3 | 并联创建文件夹 |
mkdir -p 目录1/目录2/目录3 | 串联创建文件夹 |
mv 路径信息/目标文件夹 目的路径/目的文件夹 -r | 剪切目录 |
rmdir 文件夹 | 删除指定空目录,如果目录不是空的,会提示错误 |
rm -r 文件夹 | 删除文件夹的时候使用(空的和不空的都可以删除) |
rm -rf 文件夹 | rm命令通常用于删除Linux中的文件。可以添加参数用来删除目录; -f 强制删除而不提示;-r 递归删除文件夹; -i 向用户确认是否删除 |
目录结构
根目录/
,所有的文件都挂载在这个节点下,根目录里的结构如下
切换目录
#以根目录开头,绝对路径
cd /目录名
#不以根目录开头但文件要存在才能切换成功,相对路径
cd 目录名
#返回上级目录
cd ..
#返回自己家目录
cd ~
#回看 但只在自己现所在的目录和上一次的目录之间回看
cd -
#回到家目录
cd --
目录查看
ls
是系统目录查看命令,通过ls /
命令查看根目录里的内容,各子目录所代表的内容如下:
#binshi Binary的缩写,表示二进制文件,bin目录包含了会被所有用户使用的可执行程序 cd /bin #包含于linux启动密切相关的文件 cd /boot #dev是Device(设备)的缩写,表示设备,它里面的子目录每一个对应一个外设,比如我们的光盘驱动器的文件就在这里面 cd /dev #包含系统的配置文件 cd /etc #用户的主目录,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的 cd /home #lib是Library的缩写,表示库,包含被程序所调用的库文件 cd /lib #这个目录一般情况下是空的,当系统非法关机后,这里就存放一些文件 cd /lost+found #媒体,可移动的外设(USB盘、SD卡)插入电脑时,Linux可以让我们通过media的子目录来访问这些外设的内容 cd /media #Mount的缩写,表示挂载,类似media,一般表示临时挂载一些装置 cd /mnt #这里给主机额外安装软件所摆放的目录。比如开发者安装一个ORALCE数据库则就可以放到这个目录下。默认是空的 cd /opt #这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息 cd /proc #超级用户,root的家目录 cd /root #s就是super user的意思,这里存放的是系统管理员使用的系统管理程序 cd /sbin #service的缩写,该目录存放一些服务启动之后需要提取的数据 cd /srv #这是Linux2.6内核的一个很大的变化,该目录下安装2.6内核中新出现的一个文件系统sysfs cd /sys #这个目录是用来存放一些临时文件的。用完即丢的文件 cd /tmp #这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录 cd /usr #variable的缩写,表示动态的,通常包含程序的数据,比如Log文件 cd /var
这里要注意,“/
“是根目录,”~
“是家目录。linux存储是以挂载的方式,相当于树状的,源头就是”/
”,也就是根目录,而每个用户都有"家"目录,也就是用户的个人目录,比如root用户的"家"目录就是/root
,普通用户a的"家"目录就是/home/a
。
[注]
8./etc/passwd文件是用户管理工作涉及的最重要的文件
9.linux系统中的每个用户都在/etc/passwd文件中有一个对应的记录行,它记录着用户的一些基本信息,这个文件对所有用户都是可读的
10./etc/passwd中每行记录用(:)分隔为7个字段,其格式和含义是
(用户名:口令:用户账号标识号:组标识号:注释性描述:主目录:登录xshell)
11.口令中一些系统中,存放着加密后的用户口令字
列出命令(ls)
#列出目录
ls
#和ls -l效果一样,查看文件属性、权限,没有隐藏文件
ll
#-a参数即all,查看全部的文件,包括隐藏文件
ls -a
#-l参数,列出所有的文件,包括文件的属性和权限,没有隐藏文件
ls -l
#-a和-l的组合,列出所有文件的属性和权限,包括隐藏文件
ls -al
查找命令(find)
find 命令用来在指定目录下查找文件,命令格式:find 目录 参数 文件名称
参数 | 作用 |
---|---|
-name | 以文件名查找 |
-type | 以文件属性查找 |
#列出当前目录及子目录下的所有文件和文件夹,其中. 代表当前文件夹,会递归查找子文件夹
find .
#在/usr目录下查找FeraoRedisConfig文件夹
find /usr -name "FeraoRedisConfig"
#在/usr目录下查找以.txt结尾的文件名,文件名 可用文件全名或*代表不确定部分,如*.sh
find /usr -name "*.txt"
#查找/目录下文件名包含of的文件
find / -name '*of*'
#查找/目录下文件大小大于100M的文件
find / -type f-size +100M
文件颜色
在上图中每类颜色代表不同含义,含义如下:
• 绿色文件:执行文件,可执行的程序
• 红色文件:压缩文件或者包文件
• 蓝色文件:目录
• 白色文件:普通,如文本文件、配置文件、源码文件等
• 浅蓝色文件:链接文件,主要是使用ln命令建立的文件
• 红色闪烁:表示链接的文件有问题
• 黄色文件:表示设备文件
• 灰色文件:表示其他文件
文件权限
chmod 命令是 change mode 的缩写,用于管理文件和目录的权限,并确定谁可以访问它们。该命令有两种用法,字符指定权限法和数字指定权限法。
注意只有文件或目录的所有者或root管理员才能有权限执行。
chmod
命令:重新设定不同的访问权限。
chown
命令:更改某个文件或目录的所有者。
chgrp
命令:来更改某个文件或目录的用户组。
字符指定权限法
格式:
• chmod <参数> <指定用户>+<权限设置> file
:使权限范围内的目录或者文件具有指定的权限
• chmod <参数> <指定用户>-<权限设置> file
:删除权限范围的目录或者文件的指定权限
• chmod <参数> <指定用户>=<权限设置> file
:设置权限范围内的目录或者文件的权限为指定的值
参数:
参数 | 内容 |
---|---|
-c | 改变权限成功后再输出成功信息 |
-f | 改变权限失败后不显示错误信息 |
-R | 递归处理所有子文件 |
-v | 显示执行过程详细信息 |
指定用户:
参数 | 内容 |
---|---|
u | (user)代表用户 |
g | (group)代表用户组 |
o | (other)代表其他 |
a | (all)代表所有 |
权限设置:
参数 | 内容 |
---|---|
r | 读权限 |
w | 写权限 |
x | 执行权限 |
- | 删除权限 |
s | 特殊权限 |
#增加授予这个文件的所属者执行的权限
chmod u+x somefile
#授予所有用户这个文件的执行权
#chmod <权限范围>+<权限设置> file
chmod +x somefile
chmod a+x somefile
#为所有用户分配读权限
chmod =r file
# 递归地给directory目录下所有文件和子目录的属主分配读的权限
chmod -R u+r directory
数字指定权限法
权限对应数字:
参数 | 内容 |
---|---|
r | 读权限,用数字4表示 |
w | 写权限,用数字2表示 |
x | 执行权限,用数字1表示 |
- | 删除权限,用数字0表示 |
每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,数字设定法的一般形式为:
chmod [mode] 文件名
#权限为 [rwxrwx---]
#owner = r w x = 4 + 2 + 1 =7
#group = r w x = 4 + 2 + 1 =7
#others = - - - = 0 + 0 + 0 =0
chmod 770 filename
#权限为 [rwxrwxrwx]
#owner = r w x = 4 + 2 + 1 =7
#group = r w x = 4 + 2 + 1 =7
#others = r w x = 4 + 2 + 1 =0
chmod 777 filename
文件操作
创造、拷贝、剪切、修改文件(touch、cp、mv)
命令 | 描述 |
---|---|
touch 文件名称 | 创造文件 |
cp 路径信息/拷贝文件 目的路径/复制的文件 | 拷贝文件 |
cp 路径信息/拷贝文件 目的路径/复制的文件 -r | 递归拷贝文件 |
mv 路径信息/目标文件 目的路径/目的文件 | 剪切文件 |
mv 目标文件名 修改后的文件名 | 修改文件名 |
查阅文件(cat、tac、more、less)
命令 | 描述 | 场景 |
---|---|---|
cat [文件名称] [辅助指令] | 一次性显示文件所有内容,更适合查看小的文件,常用辅助指令 -n,用来显示行号 | |
tac [文件名称] | 由最后一行开始显示文件内容 | |
more [文件名称] | 一页一页的显示文件内容 | |
less [文件名称] | 分屏显示文件内容,空格下翻页,pageDown、pageUp键代表翻动页面 | 适用查看内容较多的文件 |
head [辅助指令] [数量] [文件名称] | 查看文件开头内容,默认文件的10行,常用辅助指令 -n,后跟数量指定展示行数 | |
tail [辅助指令] [文件名称] | 查看文件末尾内容,默认文件的结尾10行,并实时监控文件,常用辅助命令 -f 会每秒检查文件是否有更新 | tail -100f cloud-init.log |
#【常用指令】
#/ 键:进入搜索模式,此时按n键跳到下一个符合位置,按N键跳到上一个符合位置,同时也可以输入正则表达式匹配
#d 键:前进半页;
#u 键:后退半页;
#q 键:停止读取文件,中止 less 命令;
#空格键:前进一页(一个屏幕);
#b 键:后退一页;
筛选文件中的关键字(grep-过滤文本)
grep 全称是Global Regular Expression Print(全局正则表达式版本),它的使用权限是所有用户。
命令:grep [指定内容] [文件名称] -[辅助指令] [–color]
辅助指令包含:
• A20 :显示匹配行的前20行
• B20 :显示匹配行的后20行
• C20 :显示匹配行前后20行
文本数据处理(sed-修改文本)
文本数据处理(awk-处理文本)
awk 命令是逐行扫描文件(从第 1 行到最后一行),寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;反之,则不对行做任何处理。
awk 命令的基本格式为: awk [选项] '脚本命令' 文件名
选项内容
选项 | 作用 |
---|---|
-F fs | 指定以 fs 作为输入行的分隔符,awk 命令默认分隔符为空格或制表符 |
-f file | 从脚本文件中读取 awk 脚本指令,以取代直接在命令行中输入指令 |
-v var=val | 在执行处理过程之前,设置一个变量 var,并给其设备初始值为 val |
脚本命令
awk 的强大之处在于脚本命令,它由 2 部分组成,分别为匹配规则和执行命令,如下所示:
'匹配规则{执行命令}'
匹配规则用来指定脚本命令可以作用到文本内容中的具体行,可以使用字符串(比如 /demo/,表示查看含有 demo 字符串的行)或者正则表达式指定。
另外需要注意的是,整个脚本命令是用单引号(‘’)括起,而其中的执行命令部分需要用大括号({})括起来。
在 awk 程序执行时,如果没有指定执行命令,则默认会把匹配的行输出;如果不指定匹配规则,则默认匹配文本中所有的行。
举个简单的例子:
awk '/^$/ {print "Blank line"}' test.txt
在此命令中,/^$/ 是一个正则表达式,功能是匹配文本中的空白行,同时可以看到,执行命令使用的是 print 命令,此命令经常会使用,它的作用很简单,就是将指定的文本进行输出。因此,整个命令的功能是,如果 test.txt 有 N 个空白行,那么执行此命令会输出 N 个 Blank line。
数据字段变量
awk 的主要特性之一是其处理文本文件中数据的能力,它会自动给一行中的每个数据元素分配一个变量。
默认情况下,awk 会将如下变量分配给它在文本行中发现的数据字段:
• $0 代表整个文本行;
• $1 代表文本行中的第 1 个数据字段;
• $2 代表文本行中的第 2 个数据字段;
• $n 代表文本行中的第 n 个数据字段。
前面说过,在 awk 中,默认的字段分隔符是任意的空白字符(例如空格或制表符)。 在文本行中,每个数据字段都是通过字段分隔符划分的。awk 在读取一行文本时,会用预定义的字段分隔符划分每个数据字段。例如:
[root@localhost ~]# cat data2.txt
One line of test text.
Two lines of test text.
Three lines of test text.
[root@localhost ~]# awk '{print $1}' data2.txt
One
Two
Three
该程序用 $1 字段变量来表示“仅显示每行文本的第 1 个数据字段”。当然,如果你要读取采用了其他字段分隔符的文件,可以用 -F 选项手动指定。
文件内容信息汇总(wc)
该命令统计给定文件中的字节数,字数,行数。如果没有给出文件名,则从标准输入读取.
wc
同时也给出所有指定文件的总统计数。字由空格字符区分开的最大字符串。
#查看文件里有多少字节(统计字节数)
wc -c filename
#查看文件里有多少行(统计行数)
wc -l filename
#查看文件里有多少个word(统计字数)
wc -w filename
#文件里最长的哪一行是有多少个字
wc -L filename
修改文件(vim)
用户刚启动vi/vim,便进入了命令模式,此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。
命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。
底线模式的启动方式是在命令模式下按:
,底线命令模式可以输入单个或多个字符的命令,基本命令有(w)保存文件,(q)退出程序
模式 | 描述 | 命令 |
---|---|---|
命令模式 | 不管用户处于何种模式,只要按下Esc键就可使进入命令行模式。 | Esc 进入模式; i 切换到输入模式;: 切换到底线命令模式,以在最底一行输入命令 |
输入模式 | 只有在vim编辑模式下,才能将键盘键入的内容输入到当前打开的文件中 | 进入模式: i 、a 、o ;退出模式:Esc |
底线命令 | 同时也可以设置编辑环境和一些编译工作,如列出行号(set nu)、寻找字符串(/target)等。 | 进入模式: : ;保存并退出::wq ;强制退出并忽略所有更改::q! ;放弃所有修改,并打开原来文件::e! |
文件内查找
#向下查找字符串
#n : 继续搜寻下一个
#N : 上寻找
/[要查找的字符]
#向上查找字符串
?[要查找的字符]
[注]可以使用man[命令]来查看各个命令的使用文档,如 man cp网络配置目录:cd /etc/sysconfig/network-scripts (CentOS7)ifconfig查看网络配置
软链接与硬链接
分类
硬链接
A---B,假设B是A的硬链接,那么他们两个指向了同一个文件,允许一个文件拥有多个路径,用户
可以通过这种机制建立硬链接到一些重要的文件上,防止误删
软链接
类似windows下的快捷方式,删除源文件,快捷方式也访问不了了
命令
ln 原文件 链接新文件 创建硬链接
ln -s 原文件 链接新文件 创建一个软链接(符号链接)
touch 新文件 创建文件
echo “字符串” >> 文件 输入字符串
特殊符操作(;、&、|)
分号操作(; )
用;号隔开每个命令, 每个命令按照从左到右的顺序,顺序执行, 彼此之间不关心是否失败, 所有命令都会执行。
格式:command1 ; command2
&号操作(&)
&放在启动参数后面表示设置此进程为后台进程。
默认情况下,进程是前台进程,这时就把Shell给占据了,我们无法进行其他操作,对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个’&'实现这个目的。
格式:command1 &
管道操作(|)
管道是一种通信机制,通常用于进程间的通信(也可通过socket进行网络通信),它表现出来的形式将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)
管道命令使用|
作为界定符号,管道命令与上面说的连续执行命令不一样。
管道命令必须要能够接受来自前一个命令的数据成为standard input继续处理才行。且管道命令仅能处理standard output,对于standard error output会予以忽略。
管道命令有:less
,more
,head
,tail
…等等都是可以接受standard input的命令。
而例如 ls
,cp
,mv
并不会接受standard input的命令,所以他们就不是管道命令了。
[拓展]命令执行顺序控制
通常情况下,开发者在终端只能执行一条命令,然后按下回车执行,那么执行多条命令的方法怎么样的? 示例如下:
#顺序执行多条(简单的顺序指令可以通过 ;来实现)
command1;command2;command3;
#有条件的执行多条命令
which command1 && command2 || command3
有条件的执行多条命令中符号含义:
&&
: 如果前一条命令执行成功则执行下一条命令,如果command1执行成功(返回0),则执行command2
||
:与&&命令相反,执行不成功时执行这个命令
$?
: 存储上一次命令的返回结果
压缩操作
打包、压缩、解压常用后缀有:
文件 | 扩展名 |
---|---|
Windows压缩文件 | .zip/.rar |
linux打包文件 | aa.tar |
linux压缩文件 | bb.gz |
linux打包并压缩文件 | .tar.gz |
文件压缩/解压缩
压缩命令:tar -zcvf 压缩文件名.tar.gz 被压缩文件名
解压缩命令:tar -zxvf 压缩文件名.tar.gz
磁盘管理(iostat、sar、df、du)
iostat
命令
iostat命令可以用来显示系统的磁盘和CPU使用情况。使用以下命令来查看磁盘的读写情况:iostat -d
这将显示每个磁盘的平均读写速度、I/O等待时间以及CPU使用情况
sar
命令
sar命令是系统活动报告(System Activity Reporter)的缩写,可以用来收集和报告系统的性能数据。使用以下命令来查看磁盘的读写情况:sar -d
这将显示每个磁盘的平均读写速度、I/O等待时间以及I/O请求的队列长度。
df
命令
查看磁盘各分区的使用情况。-h转化为更可读的模式:
结果列表中表头含义如下:
列名 | 含义 |
---|---|
Filesystem | 文件系统位于哪个分区,因此该列显示的是设备名称 |
Used | 已用 |
Available | 可用 |
Use% | 已用百分比 |
Mounted on | 所在分区(挂载点) |
du
命令
(disk usage)查看特定文件夹或文件使用空间,最后再给出一个总的占用情况。-h转化为更可读的模式:
内存管理(free)
free
命令
free命令是对 /proc/meminfo 收集到的信息的一个概述。它可以显示系统中的内存使用情况,包括总内存、已用内存、空闲内存等信息。在任意一个目录下输入free
,通常命令后跟辅助指令 -h,表示以人类可读的方式显示内存使用情况,例如使用GB或MB的单位。
cat /proc/meminfo 方式
查看RAM使用情况最简单的方法是通过 /proc/meminfo。这个动态更新的虚拟文件实际上是许多其他内存相关工具(如:free / ps / top)等的组合显示。/proc/meminfo列出了所有你想了解的内存的使用情况。进程的内存使用信息也可以通过 /proc//statm 和 /proc//status 来查看。
CPU管理(mpstat)
mpstat
命令
该命令是一个Linux系统监控命令,可以实时显示CPU使用率和其他CPU统计数据。mpstat命令默认显示所有CPU的使用情况
例如:
02:40:01 AM CPU %user %nice %sys %iowait %irq %soft %steal %guest %idle
02:40:01 AM all 5.42 0.02 2.09 0.04 0.00 0.01 0.00 0.00 92.42
其中,%user表示用户空间程序的CPU使用率,%sys表示系统内核的CPU使用率,%idle表示CPU空闲的时间。
进程管理(ps、top)
在Linux中,每一个正在运行的程序都有一个进程,每一个进程都有一个id号,并且每一个进程都会有一个父进程。
进程的存在方式有两种:前台、后台,一般的服务都是后台进行的,基本的程序都是前台运行的。
查看进程(ps)
它只显示进程的瞬间信息。ps命令参数如下:
参数 | 作用 |
---|---|
-a | 显示当前终端运行的所有的进程信息 |
-u | 以用户的信息显示进程 |
-x | 显示后台运行的进程参数 |
-aux | 以用户的信息显示所有进程信息,并包含进程参数 |
-e | 显示所有进程,环境变量 |
-f | 全格式 |
-ef | 查看全部进程且完整格式,包括命令行 |
#查看当前系统中正在执行的各种进程信息
ps
#在所有进程中匹配符合条件的字符并列出
ps -aux|grep mysql
#通过目录树结构查看
ps -ef|grep mysql
#显示进程树-p 显示父ID、-u显示用户组
ps -pu
杀死进程使用kill命令:
#杀死进程,等于windows结束任务
kill -9 [进程ID]
top
命令
它持续监视进程信息。默认每隔5秒刷新,相比ps 而言,top命令提供了更多的功能和灵活性。
语法:top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]
参数 | 说明 | 示例 |
---|---|---|
-d <秒数> | 指定 top 命令的刷新时间间隔,单位为秒 | top -d 2 |
-n <次数> | 指定 top 命令运行的次数后自动退出 | |
-p <进程ID> | 仅显示指定进程ID的信息 | top -p 1234 |
-u <用户名> | 仅显示指定用户名的进程信息 | |
-H | 在进程信息中显示线程详细信息 | |
-i | 不显示闲置(idle)或无用的进程 | |
-b | 以批处理(batch)模式运行,直接将结果输出到文件 | |
-c | 显示完整的命令行而不截断 | top -c |
-S | 累计显示进程的 CPU 使用时间 |
参数解释:
top - 00:32:08 up 150 days, 21:35, 2 users, load average: 0.91, 1.19, 1.48
23:10:41 | 系统当前时间 |
---|---|
days | 系统启动后到现在的运行时间 |
users | 当前登录到系统的用户(终端数) |
load average | 当前系统负载的平均值,系统在最近1分钟、5分钟、15分钟内,CPU的平均负载情况 |
Tasks: 101 total, 1 running, 97 sleeping, 3 stopped, 0 zombi
total | 当前系统进程总数量 |
---|---|
running | 当前运行中的进程数量 |
sleeping | 当前处于等待状态中的进程数量 |
stopped | 停止的系统进程数量 |
zombie | 僵尸进程数量 |
%Cpu(s): 13.4 us, 1.0 sy, 0.0 ni, 84.6 id, 0.0 wa, 0.7 hi, 0.3 si, 0.0 st
us | 用户空间占用CPU百分比,表示用户空间程序的cpu使用率,没有通过nice调度 |
---|---|
sy | 内核空间占用CPU百分比,系统空间的cpu使用率,主要是内核程序 |
ni | 用户进程空间内改变过优先级的进程占用CPU百分比,用户空间且通过nice调度过的程序的cpu使用率 |
id | 空闲cpu,空闲CPU百分比 |
wa | 等待输入输出的CPU时间百分比 |
hi | cpu处理硬中断的数量 |
si | cpu处理软中断的数量 |
st | 被虚拟机偷走的cpu |
MiB Mem : 1826.7 total, 85.9 free, 1477.8 used, 263.1 buff/cache
total | 物理内存总量 |
---|---|
free | 空闲内存总量 |
used | 使用的物理内存总量 |
buff/cache | 缓存,用作内核缓存的内存量 |
网络操作(curl、wget)
网络上获取数据(curl)
curl是一个强大的命令行工具,用于在Linux系统中进行网络操作。除了下载文件外,curl还可以用于模拟web请求,如POST、GET等,进行调试网页等。以下是curl命令的一些常见用法和参数:
• 发送GET请求:curl [URL]
• 发送POST请求:curl -X POST [URL]
• 发送JSON数据:curl -H 'Content-Type: application/json' -d '{"key": "value"}' [URL]
• 发送文件:curl -F ‘file=@[filename]’ [URL]
• 下载文件:curl -O [URL]
• 设置用户代理:curl -A ‘User-Agent: [agent]’ [URL]
• 设置cookie:curl -b ‘cookie-string’ [URL]
curl参数:
参数 | 描述 |
---|---|
-X | 请求协议,如:GET、PUT、POST、DELETE等,默认GET; |
-H | 请求头 |
-d | POST内容 |
网络上获取数据(wget)
是一个专用的下载工具,简单、直接。支持递归下载,可以一次下载一个HTML页面或者FTP列表中的所有内容。它支持HTTP、HTTPS和FTP协议。
软件安装(rpm、yum)
软件包安装(rpm)
rpm的作用类似于蚕豆荚,华为应用市场,AppStore,主要作用是对linux服务器上的软件包进行对应管理操作,管理分为:查询、卸载、安装/更新。
软件名称.rpm
查询参数:
参数 | 作用 |
---|---|
-q | query,查询操作 |
-a | all,代表所有 |
-e | 卸载 |
–nodeps | 强制卸载 |
卸载参数:
参数 | 作用 |
---|---|
-e | 卸载 |
–nodeps | 强制卸载 |
安装参数:
参数 | 作用 |
---|---|
-i | install,安装 |
-v | 显示进度条 |
-h | 表示以"#"形式显示进度条 |
升级参数:
参数 | 作用 |
---|---|
-U | Update,更新操作 |
-v | 显示进度条 |
-h | 表示以"#"形式显示进度条 |
#查询已安装的rpm软件包
rpm -qa
#已安装的rpm软件包中搜索指定包
rpm -qa | grep firefox
rpm -e firefox --nodeps
包管理工具(yum)
yuminstall软件名称-y
安装错误排查思路:
1. yum --help,验证yum
上传下载(rz、sz)
Linux不自带rz和sz命令的需要自己手动装置rz和sz软件包,可安装lrzsz,lrzsz是一款在linux里可代替ftp上传和下载的程序
验证命令:rpm -qa | grep lrzsz
安装命令:yum -y install lrzsz
rz 命令
用于在终端中接收文件,不能接收文件夹,接收路径为当前执行rz命令的目录。
运行该命令会弹出一个文件选择窗口,从本地选择文件上传到Linux服务器即可。
语法:rz filename
参数:
参数 | 含义 |
---|---|
-b | 使用binary的方式上传,不解释字符为ascii |
-e | 对所有控制字符转义 |
-E | 相同文件名,不会将其覆盖,而是会在所上传文件后面加上.0,以此类推 |
-y | 相同文件名,覆盖 |
sz 命令
用于在终端中发送文件
语法:sz filename
参数:
参数 | 含义 |
---|---|
-a | 以文本方式传输(ascii) |
-b | 以二进制方式传输(binary) |
-e | 对控制字符转义(escape),这可以保证文件传输正确 |
开发管理(nohup)
后台运行命令(nohup)
该命令可以在你关闭终端之后继续运行相应的进程,nohup就是不挂起的意思( n ohang up)。
该命令的一般形式为:nohup Command [ Arg … ] &
后台程序在执行期间一般会有输出文件,在输出文件未指定即缺省情况下,后台运行的程序的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:
nohup java -jar xxx.jar > output1.log 2>&1 &
在上例中有三部分结构:java -jar xxx.jar
、 > output1.log
、2>&1
,分别代表 Command 和 Arg组合 结构;
在操作系统中有三个常用的流:
▶0:标准输入流 stdin
▶1:标准输出流 stdout
▶2:标准错误流 stderr
> output1.log
是省略方式,全写为1>output1.log
,我们一般用省略方式,又或者 < output1.log
,实际是 0 < output1.log
的省略方式
2>&1
的意思是把标准错误流(2)重定向到标准输出流(1)中,而标准输出又导入文件output里面,所以结果是标准错误和标准输出都导入文件output里面了。
【注】无论是否将 nohup
命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。
最后谈一下/dev/null文件的作用,这是一个无底洞,任何东西都可以定向到这里,但是却无法打开。 所以一般很大的stdou和stderr当你不关心的时候可以利用stdout和stderr定向到这里>./command.sh >/dev/null 2>&1
服务管理(systemctl、service)
(systemctl)
(CentOS7版本)systemctl 控制软件(服务)的启动、关闭、开机自启动;系统内置服务均可被Systemctl控制。
第三方软件如果自动注册了可以被systemctl控制, 没有自动注册,可以手动注册
systemctl= system系统 + control控制 (服务管理+开启启动项管理)
操作语法:systemctl start|stop|restart 系统服务的名称
显示语法:
• 显示所有启动的服务:systemctl list-units --type service
• 显示所有启动和没启动的服务:list-units --type service --all
状态语法:systemctl status 系统服务的名称
自启语法:
• 开机启动的服务:systemctl enable 系统服务的名称
• 开机不启动的服务:systemctl disable 系统服务的名称
#查看firewall服务状态
systemctl status firewalld
#开放端口重启防火墙才能生效
systemctl restart firewalld.service
(service)
CentOS6版本中管理服务开启、停止以及重启使用service 命令;
操作语法:service 系统服务的名称 start|stop|restart
防火墙-端口
firewall-cmd --list-ports 查看所有开启的端口,如果是阿里云,还需配置安全 组规则 firewall-cmd --list-all 查看防火墙所有信息 firewall-cmd --reload 更新防火墙规则 firewall-cmd --zone=public --add-port=8080/tcp --permanent 永久开放9000端口 firewall-cmd --zone=public --add-port=80-90/tcp --permanent 多端口永久开放 firewall-cmd --zone=public --remove-port=80/tcp --permanent 移除80端口号 【注】 --zone 作用域 --add-port=80/tcp 添加端口,格式为端口和通讯协议 --permanent 永久生效,没有此参数重启后失效
进阶小故事之CPU深夜狂飙
傍晚时分,警报声乍起,整个Linux帝国都陷入了惊恐之中。
安全部长迅速召集大家商讨应对之策。
“诸位,突发情况,CPU占用率突然飙升,并且长时间没有降下来的趋势,CPU工厂的阿Q向我们表达了强烈抗议”
这时,一旁的kill命令说到:“部长莫急,叫top老哥看一下谁在占用CPU,拿到进程号pid,我把他干掉就好了”
此言一出,在座的大伙都点头赞许,惊恐之色稍解。
top命令站了起来,面露得意之色,说到:“大家请看好了”,说完,打印出了当前的进程列表:
众人瞪大了眼睛,瞅了半天,也没看出哪个进程在疯狂占用CPU,top老哥这下尴尬了。
这时,一旁的ps命令凑了上来,“让我来试试”
ps命令深吸了一口气,也打印出了进程列表。
然而,依旧没有任何可疑的进程。
“你俩怎么回事,为什么没有?”,安全部长有些不悦。
“部长,我俩都是遍历的 /proc/ 目录下的内容,按理说,所有的进程都会在这里啊,我也想不通为什么找不到···”,top老哥委屈的说到。
“遍历,怎么遍历的?”
“就是通过opendir/readdir这些系统调用函数来遍历的,这都是帝国提供的标准接口,应该不会出错,除非···”,说到这,top打住了。
“除非什么?”
“除非这些系统调用把那个进程给过滤掉了,那样的话我就看不到了,难道有人潜入帝国内核,篡改了系统调用?”
安全部长瞪大了眼睛,真要如此,那可是大事啊!
眼看部长急的团团转,一旁的netstat起身说到:“部长,我之前结识一好友,名叫unhide,捉拿隐藏进程是他的拿手好戏,要不请他来试试?”
部长大喜,“还犹豫什么,赶紧去请啊!”
“已经联系了,随后就到”
部长看着netstat,说到:“正好,趁着这个功夫,你先来看看现在有没有对外可疑的连接”
netstat点了点头,随后打印出了所有的网络连接信息:
“来来来,你们挨个来认领,看看都是谁的”,部长说到。
“这个80端口的服务是我的”,nginx站了出来。
“这个6379端口服务是我的”,redis也站了出来。
“这个,9200是我的”,elasticsearch说到。
“3306那个是我的”
“8182是我的”
······
一阵嘈杂后,只剩下一个连接无人认领:
“部长,这八成就是躲在暗处那家伙的连接”,netstat说到。
安全部长思考片刻问到:“curl何在?来访问下这个IP地址,探探对方虚实”
curl站了出来,“来了来了”
curl小心翼翼的发送了一个HTTP请求过去,对方竟然回信了:
一行醒目的mining poll出现在大家面前。
“挖,挖矿病毒!”,top老哥叫了出来。
这一下,在场所有的人都倒吸了一口凉气。
部长赶紧叫防火墙firewall配置了一条规则,将这条连接掐断。
就在这时,unhide走了进来。
简单了解了情况后,unhide拍拍胸脯说到:“这事交给我了,一定把这家伙给揪出来”
随后,unhide一阵操作猛如虎,输出了几行信息:
众人皆凑了过来,瞪大了眼睛,unhide老哥果然不是盖的,果真发现了几个可疑分子。
top有点表示怀疑,问到:“敢问兄台用的什么路数,为何我等都看不到这几个进程的存在?”
unhide笑道:“没什么神秘的,其实我也是遍历 /proc/ 目录,和你们不同的是,我不用readdir,而是从进程id最小到最大,挨个访问 /proc/$pid 目录,一旦发现目录存在而且不在ps老哥的输出结果中,那这就是一个隐藏进程。”
一旁的ps笑道:“原来还有我的功劳呐”
“找到了,就是这家伙!”,netstat大声说到。
“你怎么这么肯定?”部长问到。
“大家请看,进程打开的文件都会在 /proc/pid/fd 目录下,socket也是文件,我刚看了一下,这个进程刚好有一个socket。再结合/proc/tcp信息,可以确定这个socket就是目标端口号7777的那一条!”
“好家伙!好家伙”,众人皆啧啧称赞。
“还等什么,快让我来干掉它吧!”,kill老哥已经按捺不住了。
“让我来把它删掉”,rm小弟也磨刀霍霍了。
部长摇头说到:“且慢,cp何在,把这家伙先备份到隔离目录去,以待秋后算账”
cp拷贝完成,kill和rm两位一起上,把背后这家伙就地正法了。
top赶紧查看了最新的资源使用情况,惊喜的欢呼:“好了好了,CPU占用率总算降下去了,真是大快人心”
天色已然不早,没多久,众人先后离开,帝国恢复了往日的平静。
不过,安全部长的脸上,仍然是一脸愁容。
“部长,病毒已经被清除,为何还是闷闷不乐呢?”,助理问到。
“病毒虽已清除,但却不知这家伙是如何闯入的,还有背后暗中保护隐藏它的人又是谁,这实让我在很忧心啊”
进阶小故事之轻松分析定位JVM问题
你可能一开始会比较畏惧使用复杂的工具去排查问题,又或者是打开了工具感觉无从下手,但是随着实践越来越多,对Java程序和各种框架的运作越来越熟悉,你会发现使用这些工具越来越顺手。
接下来测试使用JDK自带工具来分析和定位Java程序问题。
为了测试这些工具我们先来写一段代码:启动 10 个死循环的线程,每个线程分配一个 10MB 左右的字符串,然后休眠 10 秒。可以想象到,这个程序会对 GC 造成压力:
public static void main (String[] args) throws Exception { IntStream.rangeClosed(1, 10).mapToObj(i -> new Thread(() -> { while (true) { //每一个线程都是一个死循环,休眠10秒,打印10M数据 String payload = IntStream.rangeClosed(1, 10000000) .mapToObj(__ -> "a") .collect(Collectors.joining("")) + UUID.randomUUID().toString(); try { TimeUnit.SECONDS.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(payload.length()); } })).forEach(Thread::start); TimeUnit.HOURS.sleep(1); }
将该程序进行打包放置到虚拟机下,然后使用 java -jar 启动进程,设置 JVM 参数,让堆最小最大都是 1GB:
完成这些准备工作后,我们就可以使用 JDK 提供的工具,来观察分析这个测试程序了。
首先使用jps
命令得到Java进程列表(这会比使用ps来的方便)
然后根据jps所获取到的Pid(1556),使用jinfo
命令打印JVM的各个参数:
检查后发现如下图所示,我们设置 JVM 参数的方式不对,-Xms1g 和 -Xmx1g 这两个参数被当成了 Java 程序的启动参数,整个 JVM 目前最大内存是 4GB 左右,而不是 1GB。
把 JVM 参数放到 -jar 之前,重新启动程序,可以看到如下输出:
此时可以确认这次 JVM 参数的配置正确了
接着使用jstat命令查看GC趋势,jstat
命令允许以固定的监控频次输出JVM的各种监控指标,比如使用-gcutil 输出GC和内存占用汇总信息,每个5秒输出一次,输出100次。
可以看到 Young GC 比较频繁,而 Full GC 基本 10 秒一次;
其中,S0 表示 Survivor0 区占用百分比,S1 表示 Survivor1 区占用百分比,E 表示 Eden 区占用百分比,O 表示老年代占用百分比,M 表示元数据区占用百分比,YGC 表示年轻代回收次数,YGCT 表示年轻代回收耗时,FGC 表示老年代回收次数,FGCT 表示老年代回收耗时。
交互工具
(1)本地与远程传输文件方式
①通过SFTP标签页
secureCRT按下ALT+P 或[文件]–[连接SFTP标签页] 开启新的会话 进行ftp操作。
查看本地和远程对接目录可以通过:[选项]–[会话选项]–[SFTP标签页]
输入:help命令,显示该FTP提供的所有命令
pwd :查询linux主机所在目录(也就是远程主机目录)
lpwd:查询本地目录(一般指windows上传文件的目录:我们可以通过查看”选项“下拉框中的”会话选项“知道本地上传目录为:D:/我的文档)
ls:查询连接到当前linux主机所在目录有哪些文件
lls: 查询当前本地上传目录有哪些文件
lcd:改变本地上传目录的路径
cd: 改变远程上传目录
get 文件名称:将远程目录中文件下载到本地目录
put 文件名称:将本地目录中文件上传到远程主机(linux)
quit:断开FTP连接
环境安装
JDK安装
步骤 | 相关命令 |
---|---|
windows 上传安装包至linux | rz -b |
检测linux原先是否存在JDK环境 | java -version |
检测JDK版本信息 | rpm -qa |
删除JDK环境 | rpm -e --nodeps jdk_* |
安装JDK rpm | rpm -ivh jdk包名 |
添加环境变量配置 | vim /etc/profile |
[拓展] JDK自带工具
JDK自带了很多命令行甚至是图形界面工具,帮助我们查看JVM的一些信息。
通过下面这张图可了解各个工具的基本作用:
关键命令辅助参数:
jps辅助参数 | 作用 |
---|---|
-l | 额外输出完全的包名 |
-v | 输出jvm参数 |
-V | 输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件 |
-m | 输出main method的参数 |
-q | 仅输出VM标识符,不包括classname,jar name,arguments in main method |
-Joption | 传递参数到vm,例如:-J-Xms512m |
MYSQL安装
(5)检查MYSQL相关配置状态
在mysql内执行状态命令:status
tomcat安装
步骤一 : 官网下载tomcat9即可 ,apache-tomcat-9.0.22.tar.gz
步骤二 : linux命令
tar -zxvf apche-tomcat... 解压压缩包
./startup.sh 执行tomcat
./shutdown.sh 停止tomcat
[注]
1.上传完毕的项目直接购买自己的域名,备案解析过去即可。
2.域名解析后如果端口是80,http或者443-https 可以直接访问,如果是9000 8080,就需要通过apache或者niginx做一下反向代理即可,配置文件即可
docker安装
cat /etc/redhat-release 检测CentOS 版本 yum -y install gcc 编译C工具 yum -y install gcc-c++ 编译C++工具 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine 官网版卸载旧版本 yum install -y yum-utils device-mapper-persistent-data lvm2 安装必须的软件包 yum-config-manager --add-repo http://mirrors. aliyun.com/docker-ce/linux/centos/docker-ce.repo 设置stable镜像仓库(这里使用的是国内的) yum makecache fast 更新Yum软件包索引 yum -y install docker-ce docker-ce-cli containerd.io 安装Docker CE systemctl start docker 启动docker docker version 查看docker版本 docker pull hello-world 从docker镜像仓库中拉去hello-world镜像 docker images 查看下载好了的情况 docker run hello-world 运行helloworld ps -ef|grep docker 查看docker进程
[注]
1.gcc是拿来编译各种源代码的软件 所谓GCC包,就相当于安装GCC的安装包啦,类似WIN下的setup.exe
2.RPM是不需要GCC就可以装的,不过TAR包里都是源代码,你得自己编译才能装,所以一定要装GCC,不然无法装
3./usr/bin查看是否有gcc包
4.安装yum-utils,它提供一个yum-config-manager单元,同时安装的device-mapper-persistent-data和lvm2用于储存设备映射(devicemapper)必须的两个软件包。
elasticsearch安装
下载安装包:https://www.elastic.co/cn/downloads/elasticsearch
将下载的安装包上传至linux里,然后进行接下来的配置环节:
①创建elasticsearch数据文件和日志文件
–>在linux根路径下创建一个path文件夹:mkdir /path
–>将该文件夹更改为elsearch用户下且elsearch组:chown -R elsearch:elsearch /path/
–>进入elsearch用户中:su -elsearch
–>创建多级目录也就是创建to目录和data目录:mkdir -p to/data
–>创建多级目录也就是logs目录:mkdir -p to/logs
②更改elasticsearch配置文件
–>进入elasticsearch的配置文件:vim elasticsearch.yml
此处进行设置跨域访问支持,默认为false,跨域访问允许的域名地址,(允许所有域名)以上使用正则http.cors.allow-origin: /.*/
③
④运行elasticsearch
–>进入es文件夹下的bin目录
–>开始执行elastcsearch服务:./elasticsearch
–>若上面没有报错,可后台执行elasticsearch:./elasticsearch -d
–>测试elasticsearch:curl 'http://自己配置的IP地址:9200/'
⑤windows安装elasticsearch head
参考:https://blog.csdn.net/Zereao/article/details/89362105
参考:https://blog.csdn.net/Sunshine_liang1/article/details/96328301
cmd进入elasticsearch-head 执行cnpm run start
⑥
⑦⑧⑨
linux操作
Liniux下配置elasticsearch文件夹
getconf LONG_BIT 查看Linux是32位还是64位
groupadd elsearch 创建一个elsearch用户组
useradd elsearch -g elsearch 创建一个elsearch用户并放入elsearch用户组
chown -R elsearch:elsearch [解压后文件名] 将该elasticsearch文件更改为elsearch用户下
Liniux下更改用户空间
su -root 切换到root用户下
sysctl -w vm.max_map_count=262144 将内存设置为262144
sysctl -a|grep vm.max_map_count 查看内存设置结果
vim /etc/sysctl.conf 进入系统设置文件内
加一行:vm.max_map_count=262144
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。