Java基础Linux系统

Posted 晚风轻轻柔柔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础Linux系统相关的知识,希望对你有一定的参考价值。

CONTENT

一、常用命令

时间日期

date	显示当前时间
date +%Y	显示当前年
date +%m	显示当前月
date +%d	显示当前日
date "+%Y-%m-%d %H:%M:%S"	显示年月日时分秒

date -s [timeString]	设置系统当前时间,如date -s "2023-02-27 16:50:12"

cal		查看日历
cal [year]	显示n

关机&重启

shutdown			1分钟后关机
shutdown -h now		立即关机
shutdown -h [num]	num分钟后关机
shutdown -r now 	立即重启

halt				立即关机
reboot				立即重启
sync				把内存的数据同步到磁盘

登录&注销

su [userName]		登录
su - root			切换为root用户

logout [userName]   注销

运行级别

运行级别说明

  • 0:关机
  • 1:单用户(找回丢失密码)
  • 2:多用户没有网络服务
  • 3:多用户有网络服务(常用)
  • 4:系统未使用
  • 5:图形界面(常用)
  • 6:系统重启
init [runLevel]		切换运行级别

CentOS 7及后续版本设置默认运行级别

systemctl get-default	查看当前默认的运行级别
systemctl set-default [TARGET.target]	设置默认运行级别
	multi-user.target:analogous to runlevel 3
	graphical.target:analogous to runlevel 5

找回root用户密码(CentOS 7)

(1)在开机界面按上下方向键结束读秒

(2)选择使用的一项,按E进入

(3)找到“Linux16”所在行,在行最后输入init=/bin/sh

(4)Ctrl+X启动,进入单用户模式

(5)执行mount -o remount,rw /

(6)执行passwd

(7)输入新密码,再次输入

(8)执行touch /.autorelabel

(9)执行exec /sbin/init(时间较长耐心等待),系统重启完成修改

二、文件管理

显示当前工作路径

pwd		显示当前工作目录的绝对路径

显示文件和目录

ls	[选项] [目录]
	-a 显示当前目录所有的文件和目录包括隐藏的
	-l 以列表方式显示信息

ll [目录] 以列表方式显示信息

切换目录

cd [目录]		切换当前工作目录
cd ~	     回到当前用户的home目录
cd ..	     回到上一级目录

创建文件&目录

mkdir [目录]	    创建目录
mkdir -p [目录]	创建多级目录

touch [文件名称]	创建空文件

删除文件&目录

rmdir [目录]    删除空目录
rm [选项] [目录]   删除文件或目录
	-r 递归删除整个文件夹
	-f 强制删除不提示

拷贝文件&目录

cp [source] [dir]      将文件source拷贝到dir中
cp -r [source] [dir]   将目录source递归拷贝到dir中
\\cp -r [source] [dir]  将目录source强制覆盖到dir中不提示

移动文件&目录 / 重命名

mv [oldFileName] [newFileName]	文件重命名
mv [sourceFile] [target]	    移动文件,若target是文件名则重命名

查找文件&目录

find [folder] [option]	在目录中查找
	-name [fileName]    查找文件名
	-user [userName]	查找指定用户名的所有文件
	-size [sizeRage]	查找该大小范围的文件(+n大于、-n小于、n等于)
	-type [fileType]	查找指定类型的文件
	-o/-a/-not			查找条件 或/且/非
	-exec [command]		查找后执行命令,表示find的查找结果
	
updatedb			创建locate数据库(首次使用locate)
locate [fileName]	基于locate数据库查询文件的绝对路径

grep [option] [content] [fileName]			在文件中查找内容
	-n 显示行号
	-i 忽略大小写
	-v 反向匹配(不包含)
cat [fileName] | grep [option] [content]  	使用管道在文件中查找内容

find命令根据修改时间查找

find -[type][timeUnit] [timeRage]

type
	a 访问时间(access)
	m 修改时间(modify)
	c 名字、权限的修改时间(status change)
	
timeUnit
	min 以分为单位
	time 以天为单位
	
timeRage
	n	时间n以前
	+n	时间n以前
	-n 	时间n以内

例如
find /root -amin 10		查找/root目录下10分钟之前被访问过的文件
find /root -mtime 3		查找/root目录下3天之内被修改过的文件
find ./ -amin -120 | grep tar.gz	查找当前目录下两个小时之内创建的tar.gz文件

查看文件内容

cat [option] [fileName]	 查看文件内容
	-n 显示行号

head [fileName]	显示文件开头部分内容,默认显示10行
head -n [num] [fileName]	显示文件的前num行

tail [fileName] 显示文件末尾部分内容,默认显示10行
tail -n [num] [fileName]	显示文件的尾num行
tail -f [fileName]	实时追踪该文件的所有更新(Ctrl+C终止)

more指令是一个基于vi编辑器的文本过滤器,它以全屏方式按页显示文本文件内容,内置了若干快捷键

  • Space:向后翻一页
  • Enter:向后翻一行
  • Q:退出more模式
  • Ctrl+F:向下滚动一屏
  • Ctrl+B:向上滚动一屏
  • =:输出当前行号
cat [fileName] | more

less指令用来分屏查看文件内容,但比more指令更强大。less指令显示多少加载多少,对于显示大型文件有较高效率。less内置了若干快捷键

  • Space:向下翻动一页
  • 方向上键:向上翻动一行
  • 方向下键:向下翻动一行
  • PageDown:向下翻动一页
  • PageUp:向上翻动一页
  • Q:退出less
less [fileName]

输出重定向

[command] > [fileName]		将command的执行结果写入到文件中(覆盖)
[command] >> [fileName]		将command的执行结果写入到文件中(追加)

软链接

软链接也称为符号链接,类似于windows里的快捷方式,主要存放了链接其他文件的路径

软链接也是文件

ln -s [source file/foler] [linkName] 	给原文件创建一个软链接

历史命令

history			查看所有历史命令
history [num]	查看最近执行的num条指令
![num]			执行历史编号为num的指令

解压&压缩

gzip [fileName]		压缩文件为.gz文件
gunzip [fileName]	解压缩

zip [option] [.zip] [file/folder]	压缩文件或目录
	-r 递归压缩,压缩目录
unzip [option] [zipFile]	解压文件或目录
	-d [targetFolder]	指定解压路径
	
tar [option] [.tar.gz] [file/folder]	打包指令
	 -c 产生.tar打包文件
	 -v 显示详细信息
	 -f 指定压缩后得文件名
	 -z 打包同时压缩
	 -x 解包.tar文件
	 -C 指定解压路径
tar -zcvf [.tar.gz] [file1] [file2] ... 将文件打包并压缩为.tar.gz
tar -zxvf [.tar.gz] 					解压到当前目录
tar -zxvf [.tar.gz] -C [targetFolder]   解压到指定路径

树状显示文件结构

yum install tree	安装tree

tree [folder]	树状显示文件结构

三、用户管理

常用配置文件

(1)用户配置文件/etc/passwd,其格式为 用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

(2)口令配置文件/etc/shadow,其格式为 登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志。加密口令为!!表示未设置密码

(3)组配置文件/etc/group,其格式为 组名:口令:组标识号:组内用户列表

添加用户

useradd [userName]	创建用户(默认home目录与用户名相同)
useradd -d [userHomeFolder] [userName]	创建用户并指定home目录
useradd -g [groupName] [userName]		创建用户并指定用户组(若不指定组则以用户名创建一个组并加入

删除用户

userdel [userName]	删除用户,保留home目录(若被进程占用使用kill结束进程)
userdel -r [userName]	删除用户和home目录

一般情况下建议保留home目录!!!

修改用户信息

passwd [userName]	修改用户密码(没有用户名则给当前用户设置)

usermod -g [groupName] [userName]	修改用户所在组
usermod -d [folder]	[userName]		修改用户的home目录(前提是该用户拥有进入目录的权限)

查询用户

id [userName]	查看用户信息(用户id,组id,组)

who am i		显示第一次登录的用户名
whoami			显示当前用户

切换用户

su - [userName]	切换登录用户

用户对文件权限

查看文件详细信息可以显示用户权限,如 -rwxrw-r–

  • 0位表示文件类型。l 是链接,d 是目录,c 是字符设备如鼠标键盘,b 是块设备如硬盘
  • 1-3位表示所有者(User)的权限,分别是可读(r)、可写(w)、可执行(x)、无该权限(-)
  • 4-6位表示所属组(Group)用户的权限
  • 7-9位表示其他组(Other)用户的权限
chmod [option] [file/folder]	修改用户对文件的权限
	-R 递归设置目录下所有文件相同的权限
	
option方式1:
	+ 增加权限,- 减少权限,= 赋予权限
	u 所有者,g 所有组,o 其他人,a 所有人
	例如	chmod u=rwx,g=rx,o=x hello.java
		 chmod a+w hello.java
option方式2:
	r=4,w=2,x=1 每位数字位权限对应的数字之和
	有三位数字分别代表所有者的权限、所属组的权限、其他组用户
	例如 chmod 751 hello.java

文件已经有读或写权限但是不能读或写

如果出现某个文件一种权限已经设置,但是对应的用户仍然不能使用,需要查看所有对应上级的目录是否有这个权限,重启终端后即可生效

四、组管理

添加组

groupadd [groupName]	创建组

删除组

groupdel [groupName]	删除组

文件&目录所有者

ls -ahl		查看所有文件的所有者及详细信息

chown [userName] [file]	修改文件所有者
chown -R [userName] [folder]	递归修改目录下所有文件的所有者

文件&目录所在组

chgrp [groupName] [file/folder]	修改文件所在组

五、内存管理

显示当前的进程

ps [option]	
	-a 显示当前终端所有的进程
	-u 以用户格式显示进程信息
	-x 显示后台进程运行的参数

执行ps -aux后显示的详细信息

  • USER:进程使用者
  • PID:进程号
  • %CPU:CPU占用百分比
  • %MEM:占用内存百分比
  • VSZ:占用虚拟内存
  • RSS:占用物理内存
  • TTY:终端信息
  • STAT:当前运行状态,s为休眠(sleep),r为运行(run),D为短期等待,Z为僵死进程,T为被跟踪或停止
  • START:进程开始执行时间
  • TIME:占用CPU时间
  • COMMAND:启动该进程的指令(进程名)

查找进程中的某个命令

ps -aux | grep [command]

查找某个进程的父进程

ps -ef 	全格式显示所有进程(包括父进程号PPID)

终止进程

kill [option] [PID]
	-9 强制进程立即停止
	
killall [processName] 	通过进程名终止进程及其所有子进程

ps -aux | grep bash 	查看当前运行的终端进程

查看进程树

pstree		显示所有进程
pstree -p	显示进程数(带进程号)
pstree -u	显示进程树(带用户名)

动态监控进程

top [option]
	-d [num] 	每隔num秒更新默认为3
	-i 			不显示闲置或僵死进程
	-p [PID]	监控某个进程
  • users:用户数量
  • load average:负载均衡(均值超过0.7表示负载较大)
  • Tasks:任务数

快捷键(大写输入)

  • P:以CPU使用率排序
  • M:以内存使用率排序
  • N:以PID排序
  • q:退出
  • u:指定用户
  • k:终止进程,输入PID,输入9强制终止

六、磁盘管理

分区与挂载的概念

Linux无论有几个分区,都只有一个根目录。Linux采用载入的方式,它的文件系统包含了一整套的文件和目录,且将一个分区和一个目录联系起来,一个分区的存储空间就在这个目录中

挂载(mount)是指将一个分区与一个目录联系起来(分区和目录的映射关系,访问某个分区就是访问对应的目录)

lsblk		查看分区挂载信息
lsblk -f	查看分区挂载详细信息

  • FSTYPE:文件类型(File System Type)
  • UUID:分区唯一标识符
  • MOUNTPOINT:挂载点(挂载目录)

硬盘分区信息

Linux硬盘分为IDE硬盘和SCSI硬盘,目前基本上是SCSI硬盘。

  • SCSI硬盘的驱动器标识符为”sdx~“。sd 为设备类型。x 为盘号(a为基本盘,b为从属盘,c为辅助主盘,d为辅助从属盘)。~ 为分区号,1-4表示主分区或扩展分区,5开始表示逻辑分区
  • IDE硬盘的驱动器标识符为“hdx~”。hd 为设备类型。其余规则同上。

添加新的磁盘分区并使用

(1)虚拟机添加硬盘

(2)对硬盘进行分区

fdisk /dev/[diskName]	对硬盘进行分区管理
	n 添加分区(add a new partition)
	w 写入磁盘并退出(write table to disk and exit)
	q 直接退出不做任何修改(quit without saving changes)

(3)对分区格式化(设置文件类型),成功后会产生UUID

mkfs -t ext4 /dev/[partition]		设置分区的文件类型为ext4

(4)挂载分区到指定目录

永久挂载:修改/etc/fstab文件,添加新的挂载。执行 mount-a 即刻生效

临时挂载:

mount /dev/[partition] [targetFolder]	挂载分区到指定目录

* 注意:用命令行执行的挂载在重启后会失效!

删除挂载映射(卸载)

若当前在挂载中的目录先退出!!!

umount [partition/folder]	卸载分区对应目录

查询磁盘使用情况

df -h	查询磁盘情况

du [option] [folder]	查询指定目录的磁盘占用情况(默认查询当前目录)
	-s 指定目录占用大小汇总
	-h 带计量单位
	-a 包含文件
	--max-depth=[num]	子目录深度
	-c 列出明细
du -hac --max-depth=1

统计文件&目录数量

ls -l [folder] | grep "^-" | wc -l	统计目录下文件个数
ls -l [folder] | grep "^d" | wc -l	统计目录下目录个数

ls -lR [folder] | grep "^-" | wc -l 统计目录下文件个数(包括子目录中)
ls -lR [folder] | grep "^d" | wc -l 统计目录下目录个数(包括子目录中)

七、网络管理

NAT网络原理

在NAT模式下,Linux虚拟机的IP地址自动分配。IP地址要在同一个网段才能通讯

查看Windows环境中的VMnet8网络配置

ipconfig

查看Linux环境网络配置

ifconfig

Linux静态网络配置

设置固定的IP地址对于搭建服务器时非常重要的

(1)修改配置文件 /etc/sysconfig/network-scripts/ifcfg-ens33 指定IP地址。若要和主机通讯,要保证IP和主机都在同一网段(192.168.227.xxx)

(2)重启网络服务或重启系统生效

service network restart

reboot

设置主机名和hosts映射

hosts映射即主机名和IP地址的映射关系,通过主机名即可找到对应的IP地址

hostname	查看当前主机名

(1)修改配置文件 /etc/hostname 修改主机名,重启生效

(2)修改配置文件 /etc/hosts 写入IP地址和主机名的映射关系(主机名可以任写)

ping [hostname]		连通测试

(3)Windows环境下可以修改 C:\\Windows\\System32\\drivers\\etc\\hosts 文件进行映射

DNS

域名系统(Domain Name System),是互联网上作为域名和IP地址相互映射的一个分布式数据库。(理解为互联网上公用的大型hosts映射)

主机名解析机制

浏览器访问网站时,需要根据域名查找对应的IP地址,查找顺序固定为

(1)浏览器缓存

(2)DNS解析器缓存(Windows可用命令ipconfig /displaydns 查看

(3)本地hosts文件

(4)域名服务DNS

域名劫持是指在正确IP地址的层级之前配置错误的域名映射(例如www.baidu.com正确的域名解析在第4层域名服务DNS,若在本地hosts文件中写入错误的域名映射,浏览器就会直接调用出错误的域名

八、软件包管理(CentOS)

rpm包管理

rpm用于互联网下载包的打包及安装工具,生成.rpm文件(相当于Windows中的setup.exe)

rpm -qa 	查看已安装的rpm列表(格式为 名称-版本-适用操作系统)
rpm -q [package]	查询软件是否安装
rpm -qi [package]	查看软件包信息
rpm -ql [package]	查看软件包中的文件
rpm -qf [filePath]	查看文件所属软件包

rpm -e [package]	卸载软件包(若有其他软件包依赖于该软件包,则会出现可能破坏依赖break dependencies的错误信息)
rpm -e --nodeps [package]	强制卸载(不推荐)

rpm -ivh [packagePath]	安装软件包

yum

yum是一个Shell前端软件包管理器,基于RPM包管理,能从指定服务器自动下载rpm包并安装,可以自动处理依赖关系,并一次性安装所有依赖的软件包

yum list 	查看yum服务器是否有需要安装的软件
yum install [package]	安装软件包

安装JDK 8

(1)创建一个目录存放上传的JDK,这里我选择放在一个用户的主目录下

mkdir -p /home/wanfeng/jdk

(2)在Oracle官网下载jdk包,选择jdk-8u351-linux-x64.tar.gz(下载地址:https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html

(3)使用FinalShell上传到jdk目录中

(4)使用tar命令解压,得到jdk的目录

tar -zxvf jdk-8u351-linux-x64.tar.gz

(5)将jdk的目录移动到/usr/local/java,以方便管理(若没有该目录则新建)

mkdir /usr/local/java
mv jdk1.8.0_351/ /usr/local/java

(6)在/etc/profile中配置Java的环境变量并刷新

vim /etc/profile
    export JAVA_HOME=/usr/local/java/jdk1.8.0_351
    export PATH=$PATH:$JAVA_HOME/bin

source /etc/profile	刷新环境变量配置

javac -version
java -version	检查环境变量是否已生效

(7)新建Hello.java测试

javac Hello.java
java Hello

安装Tomcat

(1)进入Tomcat官网下载8.5版本的tar包(下载地址:https://tomcat.apache.org/download-80.cgi)

(2)使用FinalShell上传

(3)解压

tar -zxvf apache-tomcat-8.5.86.tar.gz

(4)查看防火墙端口8080的开放状态,保证该端口处于开放

firewall-cmd --query-port=8080/tcp

firewall-cmd --permanent --add-port=8080/tcp

firewall-cmd --reload

(5)外部浏览器访问 ip:8080 查看是否访问成功

(6)在apache-tomcat-8.5.86/webapps/ROOT目录中新建一个简单的html文件(如hsp.html),在外部浏览器测试 ip:8080/hsp.html 是否可以访问(目前中文会乱码,先暂时放着)

安装IDEA

(1)进入Jetbrains官网下载Linux版本的tar包(下载地址:https://www.jetbrains.com.cn/idea/download/#section=linux)

(2)用FinalShell上传到/opt目录,解压

tar -zxvf ideaIC-2022.3.2.tar.gz

(3)进入idea目录下的bin,在图形界面下执行idea.sh

(4)创建Hello.java测试

安装mysql 5.7

(1)安装wget

yum -y install wget

(2)在线下载MySQL安装包

wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

(3)安装MySQL

rpm -ivh mysql57-community-release-el7-8.noarch.rpm

(4)进入 /etc/yum.repos.d 目录

cd /etc/yum.repos.d/

(5)安装MySQL服务。

yum -y install mysql-server

如果出现公钥尚未安装的错误,执行下面的命令并重新install

rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

(6)启动MySQL服务

systemctl start mysqld

(7)获取临时密码

cat /var/log/mysqld.log | grep 'temporary password'

(8)使用临时密码登录,进入MySQL命令行

mysql -uroot -p[password]

(9)设置密码校验强度为低风险

set global validate_password_policy=LOW;

(10)设置密码长度,根据自己密码修改长度即可

set global validate_password_length=[num];

(11)修改密码

ALTER USER 'root'@'localhost' IDENTIFIED BY '[password]'; 

(12)防火墙开放3306端口,注意重载防火墙

firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload

firewall-cmd --query-port=3306/tcp	查看3306端口的状态

(13)登录MySQL

mysql -uroot -p[password]

(14)切换到mysql数据

use mysql;

(15)查看user表

select Host,User from user;

(16)设置root用户允许任何地址访问,并刷新权限

update user set Host='%' where User='root';
flush privileges;

(17)使用MySQL客户端(如Navicat)远程连接测试即可

九、服务管理&防火墙的使用

服务(service)的本质是运行在后台的进程,通常会监听某个端口,等待其他程序的请求

服务管理指令

service [serviceName] [start/stop/restart/reload/status]

在CentOS 7后,很多服务不再使用service指令,而是systemctl。使用service指令管理的服务可在/etc/init.d查看

设置系统服务自启动

setup

设置服务在指定运行级别自启动/关闭

(1)CentOS 7以前,服务用chkconfig管理,可在/etc/init.d查看

chkconfig --list	查看服务的自启动状态

chkconfig --level [num] [service] [on/off]	设置服务在num运行级别下启动/关闭

(2)CentOS 7及以后大部分服务使用systemctl管理,可在/usr/lib/systemd/system查看。另外该版本之后修改服务是否自启动会直接在运行级别3和5上生效

systemctl list-unit-files 				查看服务的自启动状态
systemctl [enable/disable] [service]	设置服务自启动/关闭
systemctl is-enabled [service]			查看服务是否自启动

systemctl status [service]					查看服务当前状态
systemctl [start/stop/restart]	[service]	开启/停止/重启服务

防火墙firewalld

防火墙管理访问linux系统的端口,即什么端口可以访问,什么端口不能访问

firewall-cmd --permanent --add-port=[端口]/[协议]		打开端口
firewall-cmd --permanent --remove-port=[端口]/[协议]	关闭端口
firewall-cmd --reload 								  重新载入生效
firewall-cmd --query-port=[端口]/[协议]					查看端口状态

监控网络状态

netstat [option]
 	-an 按一定顺序输出
 	-p 显示哪一个进程在调用
  • Proto:协议类型
  • Local Address:本地地址
  • Foreign Address:外部地址
  • State:连接状态,ESTABLISHED(已建立连接),LISTEN(监听),TIME_WAIT(等待)

十、日志管理

日志是系统信息文件,记录重要的系统事件。也能记录系统受到攻击留下的痕迹,对安全也很重要。系统日志文件通常在/var/log中

  • boot.log 系统启动日志
  • cron 记录系统定时任务日志
  • lastlog 所有用户最后一次登录的时间,是二进制文件,用lastlog命令查看
  • maillog 邮件信息日志
  • message 系统重要消息
  • secure 验证和授权方面的信息
  • /var/run/ulmp 当前已登录的用户信息,用who命令查看

日志内容的格式

  1. 事件产生的时间
  2. 服务器的主机名
  3. 服务名或主机名
  4. 事件的具体信息

日志管理服务 rsyslogd

对应的配置文件是/etc/rsyslog.conf,用于记录管理的日志。

文件格式为 [日志类型].[日志级别] [存放文件]

日志类型

  • auth:pam产生的日志
  • authpriv:ssh、ftp等登录信息日志
  • corn:时间任务相关
  • kern:内核
  • lpr:打印
  • mail:邮件
  • mark(syslog)-rsyslog:服务内部信息,时间标识
  • news:新闻组
  • user:用户程序的日志
  • uucp:unix主机之间相关的通信
  • local 1-7:自定义的日志设备

日志级别(从低到高,记录信息越来越少)

  • debug:调试信息
  • info:一般信息,最常用
  • notice:具有重要性的普通信息
  • warning:警告级别
  • err:错误级别,阻止某个功能不能正常工作的信息
  • crit:严重级别,组织整个系统或软件不能正常工作
  • alert:需要立刻修改的信息
  • emerg:内核崩溃
  • none:不记录日志
ps -aux | grep "rsyslog" | grep -v "grep"	查看rsyslogd是否启动

systemctl list-unit-files | grep rsyslog	查看rsyslogd的自启动状态

自定义日志

在配置文件中按照需求写入即可

日志轮替

把旧的日志文件移动并改名,同时建立新的日志文件。日志轮替可以在指定时间进行工作,依赖于系统定时任务,在/etc/cron.daily下有配置

CentOS 7使用logrotate进行日志轮替管理,通过/etc/logrotate.conf中的dateext参数改变日志轮替文件名字。如果有dateext参数,日志会用日期来作为日志文件的后缀。

可以指定日志保存的最大个数

可以把某个日志的轮替规则写到/etc/logrotate.d目录下

# see "man logrotate" for details
# 轮替时间(每天daily,每周weekly,每月monthly)
weekly

# 默认保存日志文件个数
rotate 4

# 在轮替后创建新的空日志文件
# create [mode] [owner] [group] 创建时指定权限,所有者,所属组
create

# 使用日期作为日志文件后缀
dateext

# 日志文件是否压缩
#compress

# mail address			日志轮替时发送到指定邮件地址
# missingok 			当日志不存在,忽略日志的警告信息
# notifempty 			如果日志为空文件,不进行轮替
# minsize 				日志轮替的最小值,即只有达到最小值才会轮替
# size					日志大于指定大小才会轮替
# sharedscripts			在次关键字之后的脚本只执行一次
# prerotate/endscript	在论题之前执行脚本命令
# postrotate/endscript 	在轮替之后执行脚本命令


# (推荐使用)引用logrotate.d目录中保存的单独的日志轮替规则
include /etc/logrotate.d

# 单独指定日志轮替规则
/var/log/wtmp 
    monthly
    create 0664 root utmp
        minsize 1M
    rotate 1


/var/log/btmp 
    missingok	
    monthly
    create 0600 root utmp
    rotate 1


查看内存日志

journalctl
journalctl -n 3		查看最新三条
journalctl --since 19:00 --until 20:00	查看时间范围的日志
journalctl -p err	报错日志
journalctl _PID=1245 _COMM=sshd	查看包含这些参数的日志

十一、Shell脚本编程

Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序。终端就是一种Shell(bash)

shell脚本格式要求

  • 脚本名以.sh结尾
  • 脚本开头为 #!/bin/bash

执行脚本

sh [filePath]		执行shell脚本
./[filePath]		执行shell脚本(需要可执行权限)

shell变量

分为系统变量和用户自定义变量。

echo $[paramName]	查看系统变量值
set					查看所有系统变量

[paramName]=[value]	自定义变量
	等号两边不能有空格
	变量名称一般习惯为大写
	
unset [paramName]	撤销变量

[paramName]=`[command]`	若以反引号定义,则执行命令并将结果赋值给变量

设置环境变量

export [paramName]=[value]	将shell变量输出为环境变量
source /etc/profile			使环境变量生效
echo $[paramName]			查看环境变量的值

注释

# [单行注释]

:<<!
	[多行注释,要和zh]
!

位置参数变量

用于获取命令行输入得参数信息

$0		表示命令本身
$1-$9 	代表第一到第九个参数
$10 	第十个以上用大括号表示

$* 		命令行所有参数,看成一个整体
$@		命令行所有参数,区分对待
$#		命令行所有参数个数

预定义变量

系统内置的定义好的变量,可以直接使用

$$ 当前进程的PID
$! 后台运行的最后一个进程PID
$? 最后一次执行命令的返回状态

运算符

$((expression)) 或者 $[expression]
expr m + n	(注意空格,若要返回结果用反引号包括)
	\\*	expr中的乘法

条件判断

if [ condition ]	判断真假,注意有if和中括号的空格,condition和中括号的空格
then 
	...
fi					if语句结束

即使没有条件(结果为false),也要有空格

字符串比较
=	字符串判断

整数比较
-lt	小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于

判断文件权限
-r 有读权限
-w 有写权限
-x 有执行权限

判断文件类型
-f 文件存在且是一个常规文件,例如 if [ -f /home/a.txt ]
-e 文件存在
-d 文件存在且是一个目录

多分支判断

if [ condition ]
then 
	...
elif [ condition ]
then 
	...
elif [ condition ]
then 
	...
fi

case语句

case $paramName in
"value1")
	...
;;
"value2")
	...
;;
*)
	...		若都不满足执行此段程序
;;

for语句

for paramName in value1 value2 ...
do
	...
done


for ((初始值;循环控制条件;变量变化))
do
	...
done

案例:1到100求和

#计算1到100所有自然数的和
SUM=0
for ((N=1 ; N<=100; N++))
do
        SUM=$[$SUM+$N]
done

echo "The sum is "$SUM 

while语句

while [ condition ]		注意while和中括号的空格
do
	...
done

案例:输入一个数,计算1到这个数的总和

SUM=0
i=1
while [ $i -le $1 ]
do
        SUM=$[$SUM+$i]
        i=$[$i+1]
done

echo "The SUM is $SUM from 1 to $1"

读取控制台输入

read [option] [param]
	-p 指定读取值时的提示符
	-t 指定读取值时的等待时间,若超时停止读取

函数

系统函数

basename [path] [suffix]	返回文件名
basename函数会删掉所有的前缀包括最后一个/字符,然后将字符串显示出来,若指定suffix(文件名后缀),basename会将后缀也删除掉

dirname [path] 		返回path中的路径部分

自定义函数

# 函数定义
function functionName()

	...
	return int;


# 函数调用
functionName param1 param2 ...

十二、定时任务调度

crond任务调度

指定系统在某个时间执行特定的命令或程序

crontab [option]
	-e 编辑crontab定时任务
	-l 查询crontab定时任务
	-r 删除当前用户所有的crontab任务
	
service crond restart	重启定时任务调度

时间规则

时间部分有5个位置,依次为 
    分(0-59) 
    小时(0-23) 
    日(1-31) 
    月(1-12) 
    星期(0-7) 0和7都代表周日

每个位置的字符
	* 代表任何时间
	, 代表不连续的时间。如“0 8,10,15 * * *” 代表在8点,10点,15点
	- 代表连续的时间。如“0 5 * * 0-3”代表周日到周三的凌晨5点
	*/10 代表多久执行一次,例如“*/3 * * * *”代表每3分钟执行一次
	

例如,每个月的1号,15号的凌晨02:00将/etc目录下的所有文件输入到/tmp/to.txt文件中

0 2 1,15 * * ll /etc > /tmp/to.txt

at定时任务

一次性定时计划任务,执行完成就结束了。at的守护进程(service)atd后台运行,检查作业队列(设定好的任务)来运行。默认情况下atd每60秒检查作业队列,如果有作业运行时间与当前时间匹配,则运行此作业

ps -ef | grep atd  查看atd是否运行
at [option] [taskTime]	进入at命令行添加任务(Ctrl+D结束at命令输入)

    时间的定义
        时分 hh:mm ,若时间已过放在第二天执行
        特定时间点 midnight, noon, teatime(饮茶时间,下午4点)
        12小时制 3am,8pm
        具体日期 month day, mm/dd/yy, dd.mm.yy
        相对计时法 + count time-units 如 1p'x + 5 minutes
        today, tomorrow
    
atq		查询at作业队列
atrm [jobId]	删除对应编号的任务

案例1:定时备份数据库

需求

  • 每天凌晨两点半备份数据库wanfeng到/data/backup/db
  • 备份开始和结束都能给出相应提示信息
  • 备份后的文件要求以备份时间命名,并打包成.tar.gz
  • 在备份时检查是否有十天前的备份文件,有就将其删除

思路

(1)编写/usr/sbin/mysql_backup.sh脚本文件完成上面的需求

#!/bin/bash

# 备份wanfeng数据库的genshin表 到 /home/wanfeng/backup/db
# 日期作为文件名
TIME=`date +%Y-%m-%d_%H%M%S`
echo "current time: $TIME"

# 数据库信息
HOST=localhost
USER=root
PASSWD=200127
DB_NAME=wanfeng
BACKUP_PATH=/home/wanfeng/backup/db

# 创建备份目录
if [ ! -d $BACKUP_PATH/$TIME ]
then
        mkdir -p $BACKUP_PATH/$TIME
fi

# 备份数据库
mysqldump -u$USER -p$PASSWD --host=$HOST -q -R --databases $DB_NAME | gzip > $BACKUP_PATH/$TIME/$TIME.sql.gz

# 将对应时间的目录打包成.tar.gz文件,并删除该时间的目录
cd $BACKUP_PATH
tar -zcvf $TIME.tar.gz $TIME
rm -rf $TIME

# 检查十天前是否有.tar.gz备份文件,若有则删除
find $BACKUP_PATH -atime +10 -name "*.tar.gz" -exec rm -rf  \\;

# 备份完成
echo "MySQL backup success~"

(2)将脚本文件放入crontab定时任务调度中执行即可

crontab -e 

30 2 * * * /usr/sbin/mysql_backup.sh

十三、环境变量

基本语法

export 变量名=变量值	功能:将shell变量输出为环境变量

source 配置文件		功能:让修改后的配置信息立即生效

echo $变量名	    功能:查询环境变量的值

十四、Vim的使用

Linux内置的文本编辑器,具有程序编辑能力,编程能力丰富

模式切换

命令模式下

  • wq 保存并退出
  • q! 不保存退出

常用快捷键

一般模式

  • yy 拷贝当前行
  • [num]yy 拷贝当前行开始向下num行
  • p 在光标位置粘贴
  • dd 删除当前行
  • [num]dd 删除当前行开始向下num行
  • gg 定位到文件开头
  • G 定位到文件末尾
  • u 撤销在上一次编辑模式的操作
  • [num]Shift+g 定位到第num行

命令行模式

  • /[content] 查找内容
  • n 查找下一条
  • :set nu 显示行号
  • :set nonu 关闭行号

十五、远程登录

(1)在linux系统终端执行ifconfig,获取ens33中得公网IP

(2)在FinalShell中新建连接,输入公网IP,管理员账号密码接口成功连接

十六、Linux内核

阅读Linux内核源码可以使开发人员对操作系统的底层逻辑架构有更深刻的理解,从而能写出更优质的代码。推荐首先阅读Linux内核0.01版本,代码1w行左右。

阅读技巧:

  1. 了解源码的整体分布情况
  2. 纵向阅读:顺着程序执行顺序。横向阅读:按模块顺序

以上是关于Java基础Linux系统的主要内容,如果未能解决你的问题,请参考以下文章

第一章:Linux硬件基础运维基础

新手做linux运维需要学哪些知识

linux基础运维-认识linux目录

Linux运维是怎样的一个工作

Linux系统运维基础管理命令总结

如何零基础搭建自己的运维监控平台(Linux版)——WGCLOUD