admin管理员组

文章数量:1598838

文章目录

  • ubuntu
    • 自带文本编辑器gedit
    • 修改网络ip
    • debian包管理形式
      • dpkg和apt
    • aptitude使用
    • 删除软件
    • 修复安装
    • ubuntu扩容
    • ubuntu安装搜狗输入法
    • ubuntu防火墙管理
      • ufw、firewalld及iptables
      • ufw具体使用
        • 查看防火墙状态
        • 防火墙重启
        • 开启/关闭防火墙自启动
        • 开放/关闭端口
  • Linux
    • 三种网络连接模式:
        • hosts文件
    • 目录结构
    • vim简单介绍
    • 常用命令
        • shutdown关机
        • reboot重启
        • sync将内存数据同步到磁盘
    • 用户管理
        • gorupadd组的创建
        • useradd添加用户
        • passwd设置密码
        • id查询用户信息
        • hostname主机名
        • su切换用户
        • 显示登录到系统的账户
        • chmod修改权限
        • chown修改所有者
        • chgrp修改文件/目录所在组
        • usermod修改用户所在组
    • 帮助指令
        • 二者区别
    • 文件目录类
        • pwd 显示当前目录(绝对路径)
        • tree 梳理目录结构
        • ls 查看指定目录信息
        • **mkdir **创建目录(默认一级目录)
        • rm 删除目录
        • touch 修改文件
        • cp 复制文件
        • mv 为文件或目录改名、或将文件或目录移入其它位置。
        • cat 用于连接文件并打印到标准输出设备上
        • 输入输出重定向
        • 管道
        • more 基于vi的文本过滤器
        • less 分屏查看文件内容
        • $符的作用
        • echo输出内容到控制台
        • head显示文件开头部分内容(默认10行 )
        • tail显示文件尾部部分内容,或实时监控文件
        • ln链接
        • history查看历史命令
    • 时间日期类
        • data 显示当前日期
    • 搜索查找类
        • find查找文件
        • locate查找文件
        • find与locate的区别
        • grep过滤查找
    • 压缩和解压类
        • 只能压缩文件
        • 文件以及目录均可压缩
    • 任务调度
        • crond定时任务
        • at单次任务
    • 设备分区
        • IDE硬盘与SCSI硬盘
        • 主分区、扩展分区、逻辑分区
        • lsblk查看分区
        • 挂载分区
        • 开机默认挂载
        • 查看文件系统磁盘使用情况
        • 查看目录的磁盘使用情况
    • 进程管理
        • ps查看当前进程
        • zombie进程
        • 查找进程
        • pstree以树状图显示进程
        • kill/killall终止进程
      • 服务管理
        • 守护进程
        • 运行级别
        • systemctl命令
        • chkconfig设置服务在各个运行级别下是否自启动
      • 动态监控进程
        • top动态监控
      • 监控网络状况
        • netstat查看网络情况
    • 日志管理rsyslogd
        • 配置文件 /etc/rsyslog.conf
        • 日志文件
        • 日志轮替
        • logrotate配置文件
        • logrotate.d单独指定
    • 环境变量
        • 全局/局部环境变量
        • 局部用户定义变量
        • 设置path环境变量
        • 环境变量持久化
      • shell脚本编程
    • 构建基本脚本
      • 格式
      • 命令替换
      • 数学运算
        • bc计算器
        • 退出状态码
    • 结构化命令
      • if - then - elif / else
        • test命令
        • 复合条件
        • 双括号
      • case命令
      • for循环(shell)
        • 向列表尾部添加值
        • 从命令读取值
        • 内部字段分隔符IFS
      • for循环(c语言)
      • while
      • until命令
      • break与continue
      • 循环的输出重定向
    • 处理用户输入参数

前言:
此文是本人根据b站视频以及网上找的资料,并结合书本进行了一个月的linux自学整理出来笔记,除此之外还有平日里使用ubuntu系统踩过的一些坑的记录,如有错误还望批评指正。持续更新中~

ubuntu

自带文本编辑器gedit

使用gedit可以像widows文本编辑器那样打开一个文件

sudo gedit xxx

修改网络ip

cd /etc/netplan/
vim 01-network-manager-all.yaml

参考文章

debian包管理形式

dpkg和apt

dpkg主要用于已经下载的deb文件但需要自己安装依赖,apt-get则用于从源下载软件但可以自动解决依赖。

当然使用aptitude命令工具可以很好解决dpkg依赖的问题,aptitude工具本质上是apt工具和dpkg的前端。dpkg是软件包管理系统工具,而aptitude则是完整的软件包管理系统。

aptitude使用

dpkg工具的一个前端是aptitude,它提供了处理dpkg格式软件包的简单命令行选项

sudo apt install aptitude		#先安装aptitude
aptitude		#即可打开该工具
  • 查找所需软件包(采用模糊匹配)

    i 表示已经安装到系统上了

    p或v,说明这个包可用,但还没安装

$ aptitude search mysql
p   mysql-client                             - MySQL database client (metapackage depending on th
p   mysql-client-8.0                         - MySQL database client binaries                    
p   mysql-client-8.0:i386                    - MySQL database client binaries                    
p   mysql-client-core-8.0                    - MySQL database core client binaries               
p   mysql-client-core-8.0:i386               - MySQL database core client binaries               
p   mysql-common                             - MySQL database common files, e.g. /etc/mysql/my
v   mysql-common:i386                        -                                                   
v   mysql-common-5.6                         -                                                   
p   mysql-router                             - route connections from MySQL clients to MySQL serv
p   mysql-router:i386                        - route connections from MySQL clients to MySQL serv
p   mysql-sandbox                            - Install and set up one or more MySQL server instan                    
  • 查找所需要的包mysql-client,软件包相关的详细信息来自于软件仓库。
$ aptitude show mysql-client
软件包:mysql-client             
版本号:8.0.36-0ubuntu0.22.04.1
状态: 未安装
优先级:可选
部分:database
维护者:Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu>
体系:all
未压缩尺寸:35.8 k
依赖于: mysql-client-8.0
描述:MySQL database client (metapackage depending on the latest version)
 This is an empty package that depends on the current "best" version of mysql-client (currently
 mysql-client-8.0), as determined by the MySQL maintainers.  Install this package if in doubt
 about which MySQL version you want, as this is the one considered to be in the best shape by the
 Maintainers.
主页:http://dev.mysql/
  • 安装软件
sudo aptitude install mysql-client
  • 更新软件
aptitude safe-upgrade
  • 删除软件
sudo aptitude purge mysql-cilent

删除软件

  • 终端里直接使用apt-get安装的软件,即sudo apt-get install 软件名,卸载方法如下:
sudo apt-get remove 软件名				#可能有些配置没有清理干净
sudo apt-get remove --purge 软件名		#添加上–purge可以卸载并清除配置,完美
  • 使用.deb包进行安装的软件,即sudo dpkg -i *.deb,此时,可使用sudo dpkg -info *.deb 查看软件包信息,然后卸载方法如下:
sudo dpkg -r *.deb				#这种方法也是一样,清除不干净!!
sudo dpkg -r --purge *.deb		#可以很好的连同配置文件一起删除!

注意:若是像查看系统中已安装软件包信息,可以使用命令 dpkg -l

修复安装

sudo apt -f install			

ubuntu扩容

https://www.bilibili/video/BV1Cc41127B9?p=21

ubuntu安装搜狗输入法

https://blog.csdn/kobayashiii/article/details/136297842?spm=1001.2014.3001.5502

ubuntu防火墙管理

ufw、firewalld及iptables

UFW是Debian系列的默认防火墙,firewall 是红帽系列7及以上的防火墙(如CentOS7.x)

首先,iptables是最底层、最古老的防火墙系统,所有系统都会存在此防火墙,但一般而言只需保证该防火墙处于完全开放状态即可,其他不用管他,更不需要复杂的配置。而ufw和firewall都是较新linux系统上的替代iptables的工具,当他们同时安装在服务器上时,两者之间就会存在冲突。

firewall和ufw可共同影响服务器,任一防火墙开启都会使端口无法连接

ufw具体使用

查看防火墙状态
sudo ufw status
防火墙重启
sudo ufw reload  
开启/关闭防火墙自启动
sudo ufw enable/disable
开放/关闭端口
sudo ufw allow 21		#开启21端口
sudo ufw allow 21/ftp		#开启21端口的ftp协议
sudo ufw allow from 192.168.121.1 	#开启指定ip的所有协议 
sudo ufw allow from 192.168.121.2 to any port 3306	#开起指定ip的指定端口
 
sudo ufw delete allow 21		#关闭,其余的都同理

Linux

三种网络连接模式:

1、NAT(网络地址转换模式)–多用于家庭环境

安装好虚拟机后,它的默认网络模式就是NAT模式。

原理:通过宿主机的网络来访问公网。虚拟局域网内的虚拟机在对外访问时,使用的则是宿主机的IP地址,这样从外部网络来看,只能看到宿主机,完全看不到新建的虚拟局域网。

优势:虚拟系统接入互联网非常简单,只需宿主机器能访问互联网即可, 不需要进行任何手工配置

**2、Bridged(桥接模式)–多用于办公环境 **

类似局域网中的一台独立的主机,它可以访问内网任何一台机器,但是它要和宿主机器处于同一网段,这样虚拟系统才能和宿主机器进行通信【主机防火墙开启会导致ping不通】

设置:

(1)默认存在自动获取ip机制,只需要将虚拟机设置为Bridged(桥接模式),虚拟机会自动获取新的ip,保证ip地址与宿主机在同一个网段。

(2)如果是手工配置机制,那么为了保持虚拟机与宿主机在同一个网段,其中涉及人工配置ip,比较麻烦。

使用场景:如果想利用VMWare在局域网内新建一个虚拟服务器,为局域网用户提供网络服务,就应该选择桥接模式。

3、Host-only(主机模式) – 用得比较少

在某些特殊的网络环境中,要求将真实环境和虚拟环境隔离开,这时你就可采用host-only模式。

在这种模式下宿主机上的所有虚拟机是可以相互通信的,但虚拟机和真实的网络(物理机网络)是被隔离开的。

hosts文件

hosts是一个文本文件,用来记录IP和主机名的映射关系

目录结构

vim简单介绍

精通 VIM ,此文就够了 - 知乎 (zhihu)

常用命令

shutdown关机
shutdown -h now
reboot重启
reboot
sync将内存数据同步到磁盘
sync

用户管理

gorupadd组的创建
groupadd xxx		#组名为xxx
					#存放位置是/etc/group
useradd添加用户
useradd 用户名  #位置在/home/用户名,使用cd命令直接跳转到该目录
useradd -g 组名 用户名 	#在对应组下面创建用户
passwd设置密码
passwd 用户名  #给指定用户设置密码
  • 1、删除用户
userdel -r 用户名
  • 2、删除用户但是保留目录
urerdel 用户名
id查询用户信息
id 用户名
$ id kobayashi 
$ uid=1000(kobayashi) gid=1000(kobayashi)=1000(kobayashi),4(adm),24(cdrom),27(sudo),30(dip)
  uid:用户 gid:用户主组 groups:用户主组及其附属组
hostname主机名
/etc/hostname			#该文件中存放了主机名,可以通过修改该文件修改主机名
su切换用户
su - 用户名
显示登录到系统的账户
who am i
chmod修改权限
  rwx | rwx | rwx
Owner  Group  Other Users
例如:chmod 777 test.txt

权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。

只有文件所有者和超级用户可以修改文件或目录的权限。可以使用绝对模式(八进制数字模式),符号模式指定文件的权限

chown修改所有者
chown 用户组 文件名
chown -R 用户组 目录		#-R表示递归
chgrp修改文件/目录所在组
chgrp 组名 文件名
chgrp -R 组名 目录
usermod修改用户所在组
usermod -g 新目录 用户名

帮助指令

  • man获得帮助信息
man [命令或配置文件]
  • help
help 命令
二者区别
  • help 是内部命令的帮助,比如cd
  • man 是外部命令的帮助,比如ls

内部命令:内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的Linux系统命令,常驻内存,写在bashy源码里面,其执行速度比外部命令快,因为解析内部命令shell不需要创建子进程。比如:exit,history,cd,echo等。

外部命令:外部命令是Linux系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调用内存。通常外部命令的实体并不包含在shell中,但是其命令执行过程是由shell程序控制的。shell程序管理外部命令执行的路径查找、加载存放,并控制命令的执行。外部命令是在bash之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin…等等。可通过“echo $PATH”命令查看外部命令的存储路径,比如:ls、vi等。
用type命令可以分辨内部命令与外部命令

文件目录类

pwd 显示当前目录(绝对路径)
pwd
tree 梳理目录结构
tree /opt			#显示/opt目录的所有文件结构
tree /opt -L 1		#只显示一级目录
ls 查看指定目录信息

常用:ls -alh

**mkdir **创建目录(默认一级目录)
mkdir [选项] 要创建的目录
  • -p 创建多级目录

rm 删除目录
rm -rf 要删除的目录/文件
  • -i 删除前逐一询问确认。

  • -f (force 强制):即使原档案属性设为唯读,亦直接删除,无需逐一确认。

  • -r(recursive 递归):将目录及以下之档案亦逐一删除。

touch 修改文件

用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。

touch 文件名                   #创建一个空文件
touch testfile                #修改文件"testfile"的时间属性为当前系统时间 
cp 复制文件
cp [选项] 源文件 目标文件
  • -r (recursive 递归):若要复制的是文件夹则要加上-r 选项表示将该文件夹里所以文件递归复制到新文件夹
  • -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于 dpR 参数组合。
  • -d:复制时保留链接。这里所说的链接相当于 Windows 系统中的快捷方式。
  • -i 或 --interactive :在复制前提示确认,如果目标文件已存在,则会询问是否覆盖,回答 y 时目标文件将被覆盖。
  • -u 或 --update :仅复制源文件中更新时间较新的文件。
  • -v 或 --verbose:显示详细的复制过程。
  • -p 或 --preserve:保留源文件的权限、所有者和时间戳信息。
  • -f 或 --force:强制复制,即使目标文件已存在也会覆盖,而且不给出提示。
mv 为文件或目录改名、或将文件或目录移入其它位置。

目标目录与原目录一致,指定了新文件名,效果就是仅仅重命名。

mv  /home/ffxhd/a.txt   /home/ffxhd/b.txt    

目标目录与原目录不一致,没有指定新文件名,效果就是仅仅移动。

mv  /home/ffxhd/a.txt   /home/ffxhd/test/ 

目标目录与原目录一致, 指定了新文件名,效果就是:移动 + 重命名。

mv  /home/ffxhd/a.txt   /home/ffxhd/test/c.txt
cat 用于连接文件并打印到标准输出设备上
cat [选项] 要查看的文件
  • -n :显示行号

将源文件的内容输入目标文件里 (替换)

cat [选项] 源文件 > 目标文件

将源文件的内容添加到目标文件末尾

cat [选项] 源文件 >> 目标文件

将 "Hello,world"输入到hello.txt文件里

echo "Hello, World!" | cat > hello.txt
echo "This is a new line" | cat >> hello.txt   #在末尾添加
  • > 表示输出重定向
  • >> 表示追加
输入输出重定向

输出重定向在cat已经介绍了

输入重定向:输入重定向将文件的内容重定向到命令

$ wc < test.txt
2	11	60

wc命令可以对对数据中的文本进行计数。默认情况下,它会输出3个值:

  • 文本的行数
  • 文本的词数
  • 文本的字节数
$ wc << EOF
> test string 1
> test string 2
> test string 3
> EOF
3	9	42

综合应用

向test.sh中追加

7777
8888

$ cat << EOF >>test.sh
> 7777
> 8888
> EOF
  • EOF是END Of File的缩写,表示自定义终止符
管道

管道命令|仅能处理前一个命令传来的标准输出信息,而对于标准错误信息并没有直接处理能力

Linux系统会同时运行管道的几个命令,在系统内部将它们连接起来。在第一个命令产生输出的同时,输出会被立即送给第二个命令,以此类推。数据
传输不会用到任何中间文件或缓冲区。

在每个管道后面接的第一个数据必定是命令,而且这个命令必须要能够接受标准输出的数据才行,这样的命令才可为管道命令。例如lessgrepsedawk等都是可以接受标准输入的管道命令,而lscpmv就不是管道命令,因为它们并不会接受来自stdin的数据。

more 基于vi的文本过滤器
$ more 要查看的文件 
空格键(space)代表向下翻一页
Enter代表向下翻一行
q退出
b向前查看一屏
=输出当前行的行号
less 分屏查看文件内容

less在显示文件内容时,并不是一次将整个文件加载后才显示,而是根据显示需要加载内容,对于大型文件有较高的效率

$ less 要查看的文件
空白键向下翻一页
[ pagedown ]向下翻动一页
[ pageup ]向上翻动一页
/ 字符串向下搜寻【字串】的功能;n表示向下查找;N表示向上查找
q退出less程序

例:ps查看进程信息并通过less分页显示

ps -ef |less
$符的作用

在Linux中,使用$符号可以引用变量的值。当你希望输出变量的值时,需要在变量名前加上$符号。这样,echo命令会将变量的值替换为实际的内容,并输出到终端。

echo输出内容到控制台
echo [选项] [输出内容]
  • 输出文本:

    echo "Hello, World!"
    
  • 输出变量的值:

    name="John"
    echo $name
    
  • 输出到文件:

    echo "Hello, World!" > output.txt
    echo "Additional line" >> output.txt   #追加
    
  • 输出命令执行结果:

    echo $(ls)
    
  • 使用\ 输出一些特殊字符,例如双引号、单引号、反斜杠等

    echo "This is a \"quoted\" text."
    

    结果:This is a “quoted” text.

head显示文件开头部分内容(默认10行 )
head [参数] [文件]
  • -n<行数> 显示的行数。
tail显示文件尾部部分内容,或实时监控文件
tail [参数] [文件]
  • -n<行数> 显示的行数。
  • -f 循环读取

例:跟踪名为 notes.log 的文件的增长情况

tail -f notes.log

此命令显示 notes.log 文件的最后 10 行。当将某些行添加至 notes.log 文件时,tail 命令会继续显示这些行。 显示一直继续,直到您按下(Ctrl-C)组合键停止显示。

ln链接
  • 软链接(相当于快捷方式)
 ln -s [源文件或目录][目标文件或目录]
  • 硬链接(无法对目录进行链接)

    以文件副本的形式存在。但不占用实际空间。

ln [源文件] [目标文件]
history查看历史命令

存储于 ~/.bash_history文件中

history    		# 查看所有执行过的指令
history 10  	# 查看最近执行的10条指令
!n          	# 再次执行历史中第n号指令

时间日期类

data 显示当前日期
data    	

结果:2024年 01月 26日 星期五 21:58:56 CST

date +%F

结果:2024-01-26

搜索查找类

find查找文件
  • 按文件名查找
find /home -name *.txt  	#查找/home下面的所有txt文件
  • 按拥有者查找
find /home -user kobayashi	#在/home下查找用户名为kobayashi的文件
  • 按大小查找

    +表示大于 ;—表示小于 ;单位有k,M,G

find /home -size +200M		#在/home目录下查找大小大于200Mb的文件
locate查找文件

在ubuntu上先使用命令安装软件包

sudo apt install plocate
locate 文件名

find与locate的区别
  • 使用find指令时从硬盘上查找文件
  • locate命令使用数据库来定位文件且在使用前要更新数据库
sudo update
grep过滤查找
  • 只保留包含hello的行
  • -n表示显示匹配行以及行号
  • -v(invert-match)表示查找不匹配的
cat /home/a.txt | grep -n "hello"	#(配合管道"|"使用)
grep -n "hello" /home/a.txt		#

压缩和解压类

只能压缩文件
  • .gz文件(注意解压以及压缩均会将原文件删除)
gzip /home/hello.txt		#将/home下的hello.txt文件进行压缩
gunzip /home/hello.txt.gz	#将/home下的hello.txt.gz文件进行解压
文件以及目录均可压缩
  • .zip文件

压缩:

zip [选项] 压缩包名 源文件或源目录列表

zip hello.zip /home/hello.txt	#将/home/hello.txt文件压缩到当前文件夹下并命名为hello.zip
zip -r myhome.zip /home 		#将/home下所有文件压缩命名为myhome.zip

-r 递归压缩即压缩目录

-P 使用指定密码加密(注意P为大写)但是密码可能会被其他用户通过查看历史命令窥探到

通常使用-e来对文件进行加密,这样更加安全

解压:

unzip [选项] 缩包名地址

unzip -d /home/myhome.zip		#将myhome.zip解压缩

-o 不必先询问用户,unzip执行后覆盖原有文件。

  • .tar.gz文件
tar [选项] [归档文件] [文件或目录...]
  • -z: 表示使用gzip压缩算法进行压缩或解压缩。英文单词是"gzip"。

  • -x: 表示提取(解压缩)归档文件。英文单词是"extract"。

  • -v: 表示在命令执行过程中显示详细信息。英文单词是"verbose"。

  • -f: 表示指定压缩后的文件名。英文单词是"file"。

  • -c: 表示创建归档文件。英文单词是"create"。

    归档就是把一堆文件和目录放到一个新的文件里

  • -C(大写):切换到指定的目录,然后执行操作。

案例一:

压缩多个文件,将/home/test1.txt 和 /home/test2.txt 压缩成 test.tar.gz

tar -zcvf test.tar.gz /home/test1.txt /home/test2.txt

案例二:

将/home/test.tar.gz解压到/opt目录下

tar -zxvf /home/test.tar.gz -C /opt 	#注意C是大写的

任务调度

crond定时任务

系统调度文件

vim /etc/crontab		#这是一个系统范围的crontab文件,通常用于包含系统级别的定时任务。

用户调度文件

crontab -e				

格式:

  • crontab表达式,前面四项的关系之间为and的关系,需要同时满足才能执行;
    但星期那一项与前面月份日期是or的关系,只需满足其一即执行;
 *   *   *   *   * command
分钟 小时 日期 月份 星期 command
特殊符号含义
*所有时间
,代表不连续的时间,0 8,12,16 * * * 代表每天的8点0分,12点0分,16点0分
-代表连续的时间范围,0 8-12 * * * 代表每天的8-12点
*/n代表多久执行一次,* */2 * * * 代表每隔2h执行一次

终止任务调度

crontab -r

列出当前有哪些任务

crontab -l

重启任务调度

service crond restart
at单次任务

基本介绍:

at命令是一次性计划任务,atd在后台每60秒检查作业队列,有作业时检查其时间如果匹配上就运行。

  • 检测atd是否运行
kobayashi@LEGION:~$ ps -ef | grep atd
kobayas+    4758    4744  0 15:03 pts/0    00:00:00 grep --color=auto atd
  • 基本语法
at [选项] [日期时间]
  • 选项
-f:指定包含具体指令的任务文件
-q:指定新任务的队列名称
-l:显示待执行任务的列表
-d:删除指定的待执行任务
-m:任务执行完成后向用户发送 E-mail
  • 时间
at now + 3 minutes
或者具体时间
at 04:00 2024-02-19
  • 查看当前任务以及删除任务
kobayashi@LEGION:~$ atq
4	Mon Feb 19 04:00:00 2024 a kobayashi
kobayashi@LEGION:~$ atrm 4

设备分区

IDE硬盘与SCSI硬盘
  • IDE硬盘驱动器标识符为hdx~

  • SCSI硬盘标识符为sdx~

    其中x为盘号(a为基本盘,b为基本从属盘,c为辅助主盘,d为辅助从属盘)

    ~代表分区(前4个分区用数字1-4表示,代表主分区或扩展分区,往后都是逻辑分区)

主分区、扩展分区、逻辑分区
  • 主分区

    主分区也就是包含操作系统启动所必需的文件和数据的硬盘分区,要在硬盘上安装操作系统,则该硬盘必须得有一个主分区。

  • 扩展分区

    扩展分区也就是除主分区外的分区,但它不能直接使用,必须再将它划分为若干个逻辑分区才行。

  • 逻辑分区

    逻辑分区也就是我们平常在操作系统中所看到的D、E、F等盘。

  • 新硬盘建立分区顺序

    建立主分区→建立扩展分区→建立逻辑分区→激活主分区→格式化所有分区。

lsblk查看分区
$lsblk
NAME        MAJ:MIN			RM  		SIZE 	RO 		TYPE 	MOUNTPOINTS
设备名称  主设备号和次设备号  是否可移动设备	大小  只读标志  设备类型  挂载点
挂载分区

一、增加硬盘

在电脑上插入新的硬盘或U盘

二、对硬盘进行分区

1、找到新的硬盘

$lsblk			

2、sad为硬盘名

$fdisk /dev/sda

3、输入n (add a new partition)按照提示继续往后做,最后w退出,不保存用q

三、进行格式化

mkfs -t ext4 /dev/sda1

四、进行挂载

mount /dev/sda1 /xxx
  • xxx为要挂载的目录名字
  • sda1为分区

挂载之后xxx目录下的文件都存放在新加的硬盘上

五、卸载

umount /dev/sda1	#卸载会导致该挂载点中的内容不再可见,但并不会删除这些内容
开机默认挂载

修改配置文件

vim /etc/fstab

默认格式

UUID=xxxxxxxxxxxxxxx		/home   		ext4    	defaults    0    2
要挂载的文件系统的UUID	指定挂载点的目标目录	文件系统的类型	挂载选项(默认)0表示不应该检查,1表示应该在启动时检查,2和1一样但如果检查失败,系统不会强制进行修复。
查看文件系统磁盘使用情况
df -h 		#-h表示带计量单位
df -h /opt	#指定/opt目录
查看目录的磁盘使用情况
du -h --max-depth=1 /opt	#查询/opt目录的磁盘占用情况,深度为1

进程管理

ps查看当前进程

ps是显示瞬间进程的状态,并不动态连续,如果想对进程进行实时监控应该用top命令(ubuntu中可以直接打开系统监视器查看)

ps [选项]
选项功能
-A列出所有的进程
-w显示加宽可以显示较多的资讯
-au显示较详细的资讯
-aux显示所有包含其他使用者的进程
  • USER: 行程拥有者
  • PID: pid
  • %CPU: 占用的 CPU 使用率
  • %MEM: 占用的内存使用率
  • VSZ: 占用的虚拟内存大小
  • RSS: 占用的存储空间大小
  • TTY: 该进程是在那个终端机上面运行 (minor device number of tty)
  • STAT: 该行程的状态:
    • D: 无法中断的休眠状态 (通常 IO 的进程)
    • R: 正在执行中
    • S: 休眠状态
    • T: 暂停执行
    • Z: 不存在但暂时无法消除,造成zombie(疆尸)程序的状态
    • W: 等待状态,等待内存分配
    • <: 高优先级的行程
    • N: 低优先级的行程
    • L: 有记忆体分页分配并锁在记忆体内 (实时系统或捱A I/O)
  • START: 进程开始时间
  • TIME: 执行的时间
  • COMMAND:所执行的指令
zombie进程

概念:子进程死亡后,它的父进程会接收到通知去执行一些清理操作,如释放内存之类。然而,若父进程并未察觉到子进程死亡,子进程就会进入到“ 僵尸(zombie)”状态。

https://cloud.tencent/developer/article/1903722

查找进程

以全格式显示当前所有进程

ps -ef | grep 进程关键字		#-e显示所有进程 ,-f全格式
pstree以树状图显示进程
pstree -p		#-p表示显示pid
kill/killall终止进程

注:Linux 的 kill 命令是向进程发送信号,kill 不是杀死的意思,-9 表示无条件退出,但由进程自行决定是否退出,这就是为什么 kill -9 终止不了系统进程和守护进程的原因。

kill [选项] 进程号		#一般用-9来强行终止进程
killall 进程名称

服务管理

守护进程

定义:脱离于终端并且在后台运行的进程,一般为服务进程。

守护进程经常以超级用户(root)权限运行,因为它们要使用特殊的端口(1-1024)或访问某些特殊的资源。

运行级别
init运行级别作用
0系统默认运行级别不能设置为0,否则无法正常启动系统(一开机就自动关机)
1也称为救援模式,root权限,用于系统维护,禁止远程登陆,类似Windows下的安全模式登录。
2多用户状态,没有NFS网络支持。
3完全的多用户状态,有NFS,登陆后进入控制台命令行模式。
4系统未使用(保留)
5登陆后进入图形GUI模式或GNOME、KDE图形化界面,如X Window系统。
6系统正常关闭并重启,默认运行级别不能设为6,否则无法正常启动系统。

1、服务器通常为3,个人电脑为5

$ runlevel
N 5

2、修改系统启动时默认的运行级别

sudo systemctl set-default multi-user.target		#重启后就是命令行界面
 
sudo systemctl set-default graphical.target			#默认运行为图型界面

sudo systemctl start lightdm	/    init 5		#之后如果想回到图形界面
systemctl命令

systemctl命令管理的服务在/usr/lib/systemd/system中可以查看

systemctl list-unit-files 		#查看服务开机自启状态,可结合管道查询指定服务
systemctl enable 服务名		#设置服务开机自启动
systemctl disable 服务名		#关闭服务开机自启动
chkconfig设置服务在各个运行级别下是否自启动

chkconfig用于一些较早的Linux发行版,现在都采用systemctl了

chkconfig --level x 服务名 on/off

动态监控进程

top动态监控
top 		#默认3秒更新
操作功能
P(大写)以cpu使用率排序
M以内存排序
N以pid排序
q退出
u查找特定用户
k结束对应pid的进程-9

监控网络状况

netstat查看网络情况
netstat -anp
  • -an 按一定顺序排列输出
  • -p显示哪个进程在调用

日志管理rsyslogd

#系统日志文件存放在/var/log中

#存放了验证授权方面的信息,比如ssh登录,su切换,sudo授权等
/var/log/auth.log 		#ubuntu
/var/log/secure			#centeros

#存放了系统启动日志
/var/log/boot.log		

#存放了系统大部分重要信息
/var/log/messages

配置文件 /etc/rsyslog.conf
/etc/rsyslog.d/50-default.conf

重启服务

systemctl restart rsyslog.service

文件格式* . * 其中第一个 * 代表日志类型,第二个 * 代表日志级别,如果使用*代表全部

日志类型(部分)说明
authpam产生的日志
authprivssh、ftp等登录信息的验证信息
corn时间任务相关
kern内核
lpr打印
mail邮件
mark(syslog)-rsyslog服务内部的信息,时间标识
users用户程序产生的相关信息
uucpunix to nuix copy主机之间相关的通信

日志级别从高到低排序 ERROR、WARN、INFO、DEBUG,什么都不记录用none

日志文件

格式:

事件产生的时间		产生事件的服务器主机名		产生事件的服务名或程序名	事件的具体信息
日志轮替
logrotate配置文件

logrotate 的配置文件 /etc/logrotate.conf 为全局配置文件。

也可以把某个日志文件轮替规则单独指定,位置在/etc/logrotate.d

# rotate log files weekly
weekly

# use the adm group by default, since this is the owning group
# of /var/log/syslog.
su root adm

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
dateext

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# system-specific logs may also be configured here.

logrotate.d单独指定

格式:

/var/log/ppp-connect-errors {
	weekly
	rotate 4
	missingok
	notifempty
	compress
	nocreate
}
参数说明
daily/weekly/monthly日志轮替周期天/周/月
rotate 数字保留日志个数
missingok如果日志不存在忽略该日志的警告信息
notifempty如果日志为空则不进行日志轮替
compress日志轮替时对旧日志进行压缩

详细信息:https://c.biancheng/view/1106.html

环境变量

概念:

bash shell用一个叫作环境变量(environment variable)的特性来存储有关shell会话和工作环境的信息(这也是它们被称作环境变量的原因)
这项特性允许你在内存中存储数据,以便程序或shell中运行的脚本能够轻松访问到它们。这也是存储持久数据的一种简便方法。

全局/局部环境变量

全局环境变量对于shell会话和所有生成的子shell都是可见的。局部变量则只对创建它们的shell可见

查看全局变量

printenv		#显示全局变量

局部变量没有命令单独展示

set				#命令会显示出全局变量、局部变量以及用户定义变量。它还会按照字母顺序对结果进行排序
局部用户定义变量

export将自定义的变量设为全局变量

$ my_variable="I am Global now"
$ export my_variable
$ echo $my_variable
I am Global now
$ bash
$ echo $my_variable
I am Global now
$ exit
exit
$ echo $my_variable
I am Global now

unset删除全局变量

$ echo $my_variable
I am Global now
$ unset my_variable
$ echo $my_variable

$

注意:

  • 修改子shell中全局环境变量并不会影响到父shell中该变量的值,子shell甚至无法使用export命令改变父shell中全局环境变量的值。
  • 如果你是在子进程中删除了一个全局环境变量,这只对子进程有效。该全局环境变量在父进程中依然可用
设置path环境变量

当你在shell命令行界面中输入一个外部命令时,shell必须搜索系统来找到对应的程序。

PATH环境变量定义了用于进行命令和程序查找的目录,PATH中的目录使用冒号分隔。

$ echo $PATH
/home/kobayashi/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/home/kobayashi/go/gopath/bin

如果命令或者程序的位置没有包括在PATH变量中,那么如果不使用绝对路径的话,shell是没法找到的,这时会产生错误信息

$ myprog
-bash: myprog: command not found
环境变量持久化

之前几节设置的环境变量只能持续当前shell或者下次开机前

最好是在/etc/profile.d目录中创建一个以.sh结尾的文件。把所有新的或修改过的全局环境变量设置放在这个文件中。

在大多数发行版中,存储个人用户永久性bash shell变量的地方是$HOME/.bashrc文件

shell脚本编程

具体内容
参考这本书:这本书写的非常详细,且通俗易懂。
这里只是简单描述一下shell脚本的编写方法,以下内容均出自这本书。

构建基本脚本

格式

#!/bin/bash 是为了告诉shell这时一个脚本文件,除此之外所有的#语句都是注释

#!/bin/bash
...........

命令替换

var1=$(pwd)

#!/bin/bash
testing=$(date)
echo "The date and time are: " $testing
.......................................................
$ ./test
The date and time are: Mon Jan 31 20:23:25 EDT 2014

数学运算

  • bash shell数学运算符只支持整数运算

  • 在bash中,在将一个数学运算结果赋给某个变量时,可以用美元符和方括号 $[ operation ] 将数学表达式围起来

$ cat test7
#!/bin/bash
var1=100
var2=50
var3=5
var4=$[$var1 / ($var2 - $var3)]
echo The final result is $var4
..................................................................................
$ ./test7
The final result is 2

如果想在脚本中使用浮点数运算可以使用bc计算器

bc计算器

在bash中直接输入bc即可打开

kobayashi@LEGION:~$ bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
12*3.7
44.4
quit

在脚本中结合命令替换就能使用bc计算浮点数

$ cat test12
#!/bin/bash
var1=10.46
var2=43.67
var3=33.2
var4=71
var5=$(bc << EOF
scale = 4					#保留4位小数
a1 = ( $var1 * $var2)
b1 = ($var3 * $var4)
a1 + b1
EOF
)
echo The final answer for this mess is $var5
退出状态码

默认情况下,shell脚本会以脚本中的最后一个命令的退出状态码退出。

  • 成功结束的命令
$ echo $?
0
  • 无效命令
$ echo $?
127

有些时候可以根据状态码来判断命令错误类型,不过大部分情况下命令出错bash会自动显示问题所在

状态码描述
0命令成功结束
1一般性未知错误
2不适合的shell命令
126命令不可执行
127没找到命令
128无效的退出参数
128+x与Linux信号x相关的严重错误
130通过Ctrl+C终止的命令
255正常范围之外的退出状态码

可以使用exit命令来人为设置退出码(之后会用到)

#!/bin/bash
var=10
exit $var
$ ./test
$ echo $?
10

结构化命令

if - then - elif / else

if语句会运行条件命令。如果该命令的退出状态码是0(该命令成功运行),位于then部分的命令就会被执行。如果该命令的退出状态码是其他值,then部分的命令就不会被执行,此时如果有else将会去执行else的命令。

和c语言中的if-else语句非常像,当然也可以使用if嵌套,这里不过多赘述。

  • 以if开头以fi结尾
  • then和else这些命令是一个代码块,均会执行

使用else语句格式如下

if command1
then
commands
else
commands
fi

使用elif可以对条件进行嵌套查询

记住在 elif 语句中,紧跟其后的 else 语句属于 elif 代码块。它们并不属于之前的if-then代码块。

if command1
then
commands
elif command2
then
more commands
else
commands
fi
test命令

如果想在脚本中和其他语言一样使用if else,可以使用test命令,即if命令不检测状态码

如果test命令中列出的条件成立,test命令就会退出并返回退出状态码0

如果不写test命令的condition部分,它会以非零的退出状态码退出,并执行else语句块

#if test condition
if [ condition ]			#在代码中我们通常使用[]来代替test命令,condition与[]之间一定要用空格隔开
then
commands
fi

test命令可以判断三类条件:
数值比较、 字符串比较、文件比较

  • 数值比较

举例:

#!/bin/bash
value1=10						#
if [ $value1 -gt 5 ]
then
echo "The test value $value1 is greater than 5"
fi
  • 字符串比较

注意使用 < > 时要加上转义符\不然会被识别为重定向符

举例:

#!/bin/bash
val1=baseball
val2=hockey
if [ $val1 \> $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi
  • 文件比较

#!/bin/bash
jump_directory=/home/arthur
if [ -d $jump_directory ]
then
echo "The $jump_directory directory exists"
cd $jump_directory
ls
else
echo "The $jump_directory directory does not exist"
fi
复合条件

if-then语句允许你使用布尔逻辑来组合测试(同c语言)。有两种布尔运算符可用:
[ condition1 ] && [ condition2 ]
[ condition1 ] || [ condition2 ]

双括号

应用情况:较为复杂的数学运算

举例:

#!/bin/bash
val1=10
if (( $val1 ** 2 > 90 ))
then
(( val2 = $val1 ** 2 ))
echo "The square of $val1 is $val2"
fi

case命令

case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac
#!/bin/bash
case $(pwd) in
"/opt" | "/etc")
echo "Welcome, $USER"
echo "you are visit /opt or /etc";;
"/home")
echo "you are in /home";;
*)
echo "Sorry, you are miss";;
esac

for循环(shell)

for var in list
do
commands
done

$test变量的值会在shell脚本的剩余部分一直保持有效。它会一直保持最后一次迭代的值(除非你修改了它)

使用" "可以很好的表示出我们想要的单词

#!/bin/bash
for test in "bei'jing" shanghai "nan jing"
do
	echo "The next 省份 is $test"
done
echo $test
$ ./test.sh
The next 省份 is bei'jing
The next 省份 is shanghai
The next 省份 is nan jing
nanjing
向列表尾部添加值
list="beijing shanghai"
list=$list" nanjing"
echo $list
从命令读取值
#!/bin/bash
file="province.txt"
for list in $(cat $file)
do echo $list
done
内部字段分隔符IFS

IFS环境变量定义了bash shell用作字段分隔符的一系列字符。默认情况下,bash shell会将下列字符当作字段分隔符:

  • 空格
  • 制表符
  • 换行符

如果你想修改IFS的值,使其只能识别换行符,那就必须这么做:
IFS=$‘\n’

#!/bin/bash
file="province"
IFS=$'\n'
for list in $(cat $file)
do echo "list"
done
.......................................................
这样就能够以行为单位输出省份

for循环(c语言)

与c语言唯一不同点在于条件处要打两个括号

#!/bin/bash
for (( i=1; i <= 3; i++ ))
do
echo "The next number is $i"
done
$ ./test8
The next number is 1
The next number is 2
The next number is 3

还可以使用多个变量,但条件只能有一个

#!/bin/bash
for (( a=1, b=10; a <= 10; a++, b-- ))
do
echo "$a - $b"
done

while

格式:

while test command
do
other commands
done

注意:while命令的关键在于所指定的test command的退出状态码必须随着循环中运行的命令而改变。如果退出状态码不发生变化, while循环就将一直不停地进行下去。

举例:

#!/bin/bash
test=10
while [ $test -gt 0 ]
do echo"this is a test$test"
test=$test-1
done

until命令

until命令和while命令工作的方式完全相反。until命令要求你指定一个通常返回非零退出状态码的测试命令。只有测试命令的退出状态码不为0,bash shell才会执行循环中列出的命令。一旦测试命令返回了退出状态码0,循环就结束了

格式:

until test commands
do
other commands
done

举例:

#!/bin/bash
test=0
until [ $test -gt 2 ]
do
echo "this is $test"
test=$[$test+1]
done
echo "the last num is $test"
..................................................................
$ ./test.sh 
this is 0
this is 1
this is 2
the last num is 3

最后说明:以上的这些循环同c语言一样是可以嵌套使用的。

break与continue

break的用法同c语言

使用break n可以指定跳出几级循环(默认为1)

举例:

#!/bin/bash
for (( a = 1; a < 4; a++ ))
do
echo "Outer loop: $a"
for (( b = 1; b < 100; b++ ))
do
if [ $b -gt 4 ]
then
break 2
fi
echo "
Inner loop: $b"
done
done

continue用法类比于break

举例:

#!/bin/bash
for (( a = 1; a <= 5; a++ ))
do
echo "Iteration $a:"
for (( b = 1; b < 3; b++ ))
do
if [ $a -gt 2 ] && [ $a -lt 4 ]
then
continue 2
fi
var3=$[ $a * $b ]
echo "
The result of $a * $b is $var3"
done
done
$ ./test22
Iteration 1:
The result of 1 * 1 is 1
The result of 1 * 2 is 2
Iteration 2:
The result of 2 * 1 is 2
The result of 2 * 2 is 4
Iteration 3:
Iteration 4:
The result of 4 * 1 is 4
The result of 4 * 2 is 8
Iteration 5:
The result of 5 * 1 is 5
The result of 5 * 2 is 10

循环的输出重定向

shell会将for命令的结果重定向到文件output.txt中,而不是显示在屏幕上。

for file in /home/rich/*
do
if [ -d "$file" ]
then
echo "$file is a directory"
elif
echo "$file is a file"
fi
done > output.txt

处理用户输入参数

本文标签: 笔记Linux