Linux 常用终端命令整理(mysql、pg、nginx安装等)
linux系统中提供了大量的命令,该文整理了一份使用较为频繁的命令,并且我们对命令进行了一个详细的分类。
一 、Linux命令格式
1.1 Linux终端命令格式
终端命令格式:
command [options] [parameter]
说明:
command:命令名,相应功能的英文单词或单词的缩写;- [
options] :选项,可用来对命令进行控制,也可以省略; parameter:传给命令的参数,可以是 零个、一个 或者 多个;
在linux命令行中,命令的参数有的时候是一个连字符,有的时候是两个连字符。
对于options类型参数可以有两种方式:
- 短选项(
short options):顾名思义,就是短小参数。它们通常包含一个连字号和一个字母(大写或小写字母),例如:-s,-h等。 - 长选项(
long options):长选项,包含了两个连字号和一些大小写字母组成的单词,例如:--size,--help等。
注:
1. 一个程序通常会提供包括`short options`和`long options`两种参数形式的参数,`short options`一般是其对应的`long options`的开头字母。
2. `-`和`--`可以用来做区分`sh`是一个选项还是两个选项`s`和`h`的组合。`-sh`是`s`和`h`的组合`--sh`则说明`sh`是单一的选项。
1.2 查阅命令帮助信息
\--help:显示command命令的帮助信息;
[root@longmax2002 ~]# ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
Mandatory arguments to long options are mandatory for short options too.
-a, --all do not ignore entries starting with .
-A, --almost-all do not list implied . and ..
--author with -l, print the author of each file
-b, --escape print C-style escapes for nongraphic characters
--block-size=SIZE scale sizes by SIZE before printing them; e.g.,
'--block-size=M' prints sizes in units of
1,048,576 bytes; see SIZE format below
-B, --ignore-backups do not list implied entries ending with ~
-c with -lt: sort by, and show, ctime (time of last
man:查阅command命令的使用手册,man是manual的缩写,是Linux提供的一个手册,包含了绝大部分的命令、函数的详细使用;
man pwd
使用man时的操作键:
- 空格键:显示手册页得下一屏;
Enter键:一次滚动手册页得一行;b:回滚一屏;f:前滚一屏;q:退出;/word:搜索word字符串;
二、文件相关命令
2.1 文件操作
2.1.1 创建文件(touch)
touch命令:创建文件或修改文件时间,如果文件不存在,可以创建一个空白文件,如果文件已经存在,可以修改文件的末次修改日期。
[root@longmax2002 zy]# touch test
[root@longmax2002 zy]# ll
total 0
-rw-r--r-- 1 root root 0 Sep 29 13:18 test
2.1.2 创建目录(mkdir)
mkdir命令:创建一个新的目录。
| 选项 | 含义 |
|---|---|
| -p | 可以递归创建目录 |
新建目录的名称不能与当前目录中已有的目录或文件同名。
[root@longmax2002 zy]# mkdir test
mkdir: cannot create directory ‘test’: File exists
2.1.3 删除文件/目录(rm)
rm命令:删除文件或目录,使用rm命令要小心,因为文件删除后不能恢复。
| 选项 | 含义 |
|---|---|
| -f | 强制删除,忽略不存在的文件,无需提示 |
| -r | 递归地删除目录下的内容,删除文件夹时必须加此参数 |
rm -rf test
2.1.4 软/硬链接(ln)
命令:
ln -s 被链接的源文件 链接文件
建立文件的软链接,用通俗的方式讲类似于Windows下的快捷方式。
注意:
1. 没有`-s`选项建立的是一个硬链接文件两个文件占用相同大小的硬盘空间,工作中几乎不会建立文件的硬链接。
2. 源文件要使用绝对路径,不能使用相对路径,这样可以方便移动链接文件后,仍然能够正常使用。
在Linux中,文件名和文件的数据是分开存储的:
提示:
- 在
Linux中,只有文件的硬链接数== 0才会被删除。 - 使用
ls -l可以查看一个文件的硬链接的数量。 - 在日常工作中,几乎不会建立文件的硬链接。
2.1.5 查看文件(cat、more)
cat命令可以用来查看文件内容、创建文件、文件合并、追加文件内容等功能。
cat会一次显示所有的内容,适合查看内容较少的文本文件。
| 选项 | 含义 |
|---|---|
| -b | 对非空输出行编号 |
| -n | 对输出的所有行编号 |
[root@longmax2002 zy]# cat -n test
1 222
2 3333
3 444
4 5655
5 67777
Linux中还有一个nl的命令和cat -b的效果等价。
more命令可以用于分屏显示文件内容,每次只显示一页内容,适合于 查看内容较多的文本文件。
| 操作键 | 功能 |
|---|---|
| 空格键 | 显示手册页的下一屏 |
| Enter | 键 一次滚动手册页的一行 |
| b | 回滚一屏 |
| f | 前滚一屏 |
| q | 退出 |
| /word | 搜索 word 字符串 |
2.1.6 查看目录(ls)
ls是英文单词list的简写,其功能为列出目录的内容,是用户最常用的命令之一,类似于DOS下的dir命令。
Linux文件或者目录名称最长可以有256个字符参数;- 以 . 开头的文件为隐藏文件,需要用
-a参数才能显示; - . 代表当前目录;
- … 代表上一级目录;
ls常用选项:
| 参数 | 含义 |
|---|---|
| -a | 显示指定目录下所有子目录与文件,包括隐藏文件 |
| -l | 以列表方式显示文件的详细信息 |
| -h | 配合 -l 以人性化的方式显示文件大小 |
ls通配符的使用:
| 通配符 | 含义 |
|---|---|
| * | 代表任意个数个字符 |
| ? | 代表任意一个字符,至少 1 个 |
| [] | 表示可以匹配字符组中的任一一个 |
| [abc] | 匹匹配 a、b、c 中的任意一个 |
| [a-f] | 匹配从 a 到 f 范围内的的任意一个字符 |
注意:以 . 开头的文件为隐藏文件,需要用-a参数才能显示。
[root@longmax2002 ~]# ls *
node-v12.18.1-linux-x64.tar.xz
logs:
nacos
nacos:
naming
node-v12.18.1-linux-x64:
bin CHANGELOG.md include lib LICENSE README.md share
tree 命令可以以树状图列出文件目录结构:
| 选项 | 含义 |
|---|---|
| -d | 只显示目录 |
2.1.7 切换目录(cd)
cd是英文单词change directory的简写,其功能为更改当前的工作目录,也是用户最常用的命令之一。
| 命令 | 含义 |
|---|---|
| cd | 切换到当前用户的主目录(/home/用户目录) |
| cd ~ | 切换到当前用户的主目录(/home/用户目录) |
| cd . | 保持在当前目录不变 |
| cd … | 切换到上级目录 |
| cd - | 可以在最近两次工作目录之间来回切换 |
相对路径和绝对路径:
- 相对路径 在输入路径时,最前面不是 / 或者 ~,表示相对当前目录所在的目录位置;
- 绝对路径 在输入路径时,最前面是 / 或者 ~,表示从根目录/家目录开始的具体目录位置;
2.1.8 复制文件(cp)
cp命令的功能是将给出的文件或目录复制到另一个文件或目录 中,相当DOS下的copy命令。
| 选 项 | 含义 |
|---|---|
| -i | 覆盖文件前提示 |
| -r | 若给出的源文件是目录文件,则 cp 将递归复制该目录下的所有子目录和文件,目标文件必 |
cp 源文件 目标文件(路径+可以重命名文件名)
2.1.9 移动文件(mv)
mv命令可以用来移动文件或目录,也可以给文件或目录重命名。
| 选项 | 含义 |
|---|---|
| -i | 覆盖文件前提示 |
mv 源文件 目标文件(路径+文件名)
mv 源文件 目标路径/
2.2 打包/解包(tar)
打包压缩是日常工作中备份文件的一种方式,在不同操作系统中,常用的打包压缩方式是不同的:
Windows常用rar。Mac常用zip。Linux常用tar.gz。
tar是Linux中最常用的备份工具,此命令可以把一系列文件打包到一个大文件中,也可以把一个打包的大文件恢复成一系列文件。
tar的命令格式如下:
# 打包文件
tar -cvf 打包文件.tar 被打包的文件/路径...
# 解包文件
tar -xvf 打包文件.tar
tar选项说明:
| 选项 | 含义 |
|---|---|
| c | 生成档案文件,创建打包文件 |
| x | 解开档案文件 |
| v | 列出归档解档的详细过程,显示进度 |
| f | 指定档案文件名称,f 后面一定是 .tar 文件,所以必须放选项最后 |
注意: f 选项必须放在最后,其他选项顺序可以随意。
2.3 压缩/解压缩(gzip)
tar与gzip命令结合可以使用实现文件打包和压缩,tar只负责打包文件,但不压缩,用gzip压缩tar打包后的文件,其扩展名一般用xxx.tar.gz。
在Linux中,最常见的压缩文件格式就是xxx.tar.gz。
在tar命令中有一个选项-z可以调用gzip,从而可以方便的实现压缩和解压缩的。
功能命令格式如下:
# 压缩文件
tar -zcvf 打包文件.tar.gz 被压缩的文件/路径...
# 解压缩文件
tar -zxvf 打包文件.tar.gz
# 解压缩到指定路径
tar -zxvf 打包文件.tar.gz -C 目标路径
| 选项 | 含义 |
|---|---|
| -C | 解压缩到指定目录,注意:要解压缩的目录必须存在 |
tar与bzip2命令结合可以使用实现文件打包和压缩(用法和gzip一样,tar只负责打包文件,但不压缩,用bzip2压缩tar打包后的文件,其扩展名一般用xxx.tar.bz2。
在tar命令中有一个选项-j可以调用bzip2,从而可以方便的实现压缩和解压缩的功能。
命令格式如下:
# 压缩文件
tar -jcvf 打包文件.tar.bz2 被压缩的文件/路径...
# 解压缩文件
tar -jxvf 打包文件.tar.bz2
2.4 查找/搜索
2.4.1 查找文件(find)
find命令功能非常强大,通常用来在特定的目录下,搜索符合条件的文件。
命令:
find [路径] -name “*.py”
查找指定路径下扩展名是.py的文件,包括子目录。
- 如果省略路径,表示在当前文件夹下查找;
- 通配符,在使用
find命令时同时可用;
2.4.2 文本搜索(grep)
grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
grep命令用于查找文件里符合条件的字符串。
grep指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一列显示出来。
若不指定任何文件名称,或是所给予的文件名为-,则grep指令会从标准输入设备读取数据。
| 选项 | 含义 |
|---|---|
| -n | 显示匹配行及行号 |
| -v | 显示不包含匹配文本的所有行(相当于求反) |
| -i | 忽略大小写 |
| -q | 用于if判断,如果有匹配的内容立即返回0状态 |
| -e | 从文件内容查找与正则表达式匹配的行 |
| -r | 递归查找 |
常用的两种模式查找
| 参数 | 含义 |
|---|---|
| ^a | 行首,搜寻以 a 开头的行 |
| ke$ | 行尾,搜寻以 ke 结束的行 |
[root@longmax2002 zy]# cat -n test
1 222
2 3333
3 444
4 5655
5 67777
[root@longmax2002 zy]# ^C
[root@longmax2002 zy]# more test | grep -n -i 5655
4:5655
如果想在当前路径即子路径(R或者r参数)查找包含某个字符串的文件:
[root@VM-0-17-centos grep]# grep 222 * -nR
1.sh:3:if [[ `grep -q "222" "2222234"` ]];then
test:1:1 222
2.4.3 文本分析(awk)
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。
简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk [-F field-separator] 'commands' input-file(s)
其中,commands是真正awk命令,[-F域分隔符]是可选的。input-file(s)是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
假设ps -ef | grep nginx的输出如下:
[root@VM-0-17-centos grep]# ps -ef | grep nginx
nobody 965 16561 0 18:55 ? 00:00:00 nginx: worker process
root 10913 4865 0 21:38 pts/0 00:00:00 grep --color=auto nginx
root 16561 1 0 2020 ? 00:00:00 nginx: master process ./nginx
如果只显示进程id:
[root@VM-0-17-centos grep]# ps -ef | grep nginx | awk '{print $2}'
965
12848
16561
awk工作流程是这样的:
- 读入有
'\n'换行符分割的一条记录; - 然后将记录按指定的域分隔符划分域;
- 填充域,
$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是空格,所以$1表示登录用户,$2表示进程id,以此类推。
2.4.4 文本编辑(sed)
sed命令是利用脚本来处理文本文件。sed可依照脚本的指令来处理、编辑文本文件。
sed [-nefr] [动作]
选项与参数:
-n:使用安静(silent)模式。在一般sed的用法中,所有来自STDIN的数据一般都会被列出到终端上。但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者动作)才会被列出来。-e:直接在命令列模式上进行sed的动作编辑;-f:直接将sed的动作写在一个文件内,-f filename则可以运行filename内的sed动作;-r:sed的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)-i:直接修改读取的文件内容,而不是输出到终端。
动作说明: [n1[,n2]]function
n1,n2:不见得会存在,一般代表选择进行动作的行数,举例来说,如果我的动作是需要在10到20行之间进行的,则"10,20[动作行为] ";
function:
a:新增,a的后面可以接字串,而这些字串会在新的一行出现(下一行为新行);c:取代,c的后面可以接字串,这些字串可以取代n1,n2之间的行;d:删除,因为是删除啊,所以d后面通常不接任何字符串;i:插入,i的后面可以接字串,而这些字串会在新的一行出现(上一行为新行);p:列印,亦即将某个选择的数据印出。通常p会与参数sed -n一起运行;s:取代,可以直接进行取代的工作,通常这个s的动作可以搭配正则表达式;
这是1.txt的内容:
[root@VM-0-17-centos grep]# cat 1.txt
d
ddd
#fff
修改1.text,将匹配到的第一个d替换成7523:
[root@VM-0-17-centos grep]# sed -i 's/d/7523/' 1.txt
[root@VM-0-17-centos grep]# cat 1.txt
7523
7523dd
#fff
修改1.text,将匹配到的所有d替换成7523:
[root@VM-0-17-centos grep]# sed -i 's/d/7523/g' 1.txt
[root@VM-0-17-centos grep]# cat 1.txt
7523
752375237523
#fff
去掉行首带@的首字母@:
sed -i 's/^@//' file
特定字符串的行前插入新行:
sed -i '/特定字符串/i 新行字符串' file
特定字符串的行后插入新行:
sed -i '/特定字符串/a 新行字符串' file
[root@VM-0-17-centos grep]# sed -i '/#fff/a xxxxxx' 1.txt
[root@VM-0-17-centos grep]# cat 1.txt
d
ddd
#fff
xxxxxx
特定字符串的删除:
sed -i '/字符串/d' file
删除第m到第n行:
sed -i 'm,nd file
三、进程、内存系统信息相关命令
3.1 查看系统
uname -a(Linux查看版本当前操作系统内核信息)
[root@longmax2002 yuncang]# uname -a
Linux longmax2002 3.10.0-862.14.4.el7.x86_64 #1 SMP Wed Sep 26 15:12:11 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
cat /proc/version(Linux查看当前操作系统版本信息)
[root@longmax2002 yuncang]# cat /proc/version
Linux version 3.10.0-862.14.4.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) ) #1 SMP Wed Sep 26 15:12:11 UTC 2018
cat /etc/issue或cat /etc/redhat-release(Linux查看版本当前操作系统发行版信息)
[root@longmax2002 yuncang]# cat /etc/issue
\S
Kernel \r on an \m
.getconf LONG_BIT(Linux查看版本说明当前CPU运行在32bit模式下, 但不代表CPU不支持64bit)
hostname(查看服务器名称)
[root@longmax2002 yuncang]# hostname
longmax2002
cat /proc/cpuinfo( 查看CPU信息 )
[root@longmax2002 yuncang]# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 85
model name : Intel(R) Xeon(R) Platinum 8269CY CPU @ 2.50GHz
stepping : 7
microcode : 0x1
cpu MHz : 2500.016
cache size : 36608 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 1
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 22
wp : yes
3.2 时间和日期(date、cal)
3.2.1 date
date命令:查看系统时间;
[root@longmax2002 zy]# date
Wed Sep 29 13:41:41 CST 2021
3.2.2 cal
cal命令:calendar查看日历,-y选项可以查看一年的日历;
[root@longmax2002 zy]# cal
September 2021
Su Mo Tu We Th Fr Sa
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
3.3 进程信息(ps、top、kill、pgrep)
所谓进程,通俗地说就是 当前正在执行的一个程序。
3.3.1 ps
Linux ps(英文全拼:process status)命令用于显示当前进程的状态,类似windows的任务管理器。
ps [options] [--help]
| 选项 | 含义 |
|---|---|
| a | 显示终端上的所有进程 |
| u | 显示进程的详细状态 |
| x | 显示没有控制终端的进程 |
| -A | 显示终端上的所有进程 |
| -e | 等于"-A" |
| e | 显示环境变量 |
| f | 显示程序间的关系 |
ps aux:显示所有包含其他使用者的进程。
[root@longmax2002 yuncang]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 51736 2712 ? Ss May10 5:03 /usr/lib/syste
root 2 0.0 0.0 0 0 ? S May10 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S May10 0:13 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< May10 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S May10 0:05 [migration/0]
root 8 0.0 0.0 0 0 ? S May10 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S May10 39:39 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< May10 0:00 [lru-add-drain
root 11 0.0 0.0 0 0 ? S May10 0:30 [watchdog/0]
root 12 0.0 0.0 0 0 ? S May10 0:20 [watchdog/1]
root 13 0.0 0.0 0 0 ? S May10 0:06 [migration/1]
root 14 0.0 0.0 0 0 ? S May10 0:20 [ksoftirqd/1]
root 16 0.0 0.0 0 0 ? S< May10 0:00 [kworker/1:0H]
root 18 0.0 0.0 0 0 ? S May10 0:00 [kdevtmpfs]
root 19 0.0 0.0 0 0 ? S< May10 0:00 [netns]
root 20 0.0 0.0 0 0 ? S May10 0:07 [khungtaskd]
root 21 0.0 0.0 0 0 ? S< May10 0:00 [writeback]
root 22 0.0 0.0 0 0 ? S< May10 0:00 [kintegrityd]
root 23 0.0 0.0 0 0 ? S< May10 0:00 [bioset]
root 24 0.0 0.0 0 0 ? S< May10 0:00 [bioset]
root 25 0.0 0.0 0 0 ? S< May10 0:00 [bioset]
root 26 0.0 0.0 0 0 ? S< May10 0:00 [kblockd]
root 27 0.0 0.0 0 0 ? S< May10 0:00 [md]
root 28 0.0 0.0 0 0 ? S< May10 0:00 [edac-poller]
root 35 0.0 0.0 0 0 ? S May10 58:07 [kswapd0]
查找指定进程:
ps -ef | grep 进程关键字
显示指定用户进程信息:
ps -u root
根据端口获取进程pid:
port=30999
#根据端口号查找对应的pid
pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }');
3.3.2 top
Linux top命令用于实时显示process的动态。显示进程信息:
top - 14:26:38 up 141 days, 17:15, 1 user, load average: 0.00, 0.10, 0.27
Tasks: 86 total, 1 running, 85 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.3 sy, 0.0 ni, 99.3 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3880924 total, 682528 free, 1590964 used, 1607432 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 2034188 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3441 mysql 20 0 1951624 639476 5048 S 0.3 16.5 518:43.85 mysqld
7515 root 10 -10 141776 18480 4532 S 0.3 0.5 65:36.51 AliYunDun
9827 root 10 -10 41932 1920 420 S 0.3 0.0 7:15.38 AliYunDunUpdate
29249 root 20 0 145308 1500 248 S 0.3 0.0 82:52.92 redis-server
1 root 20 0 51736 2712 1376 S 0.0 0.1 5:03.56 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.08 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:13.22 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0.0 0.0 0:05.41 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 39:39.82 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
11 root rt 0 0 0 0 S 0.0 0.0 0:30.64 watchdog/0
12 root rt 0 0 0 0 S 0.0 0.0 0:20.67 watchdog/1
13 root rt 0 0 0 0 S 0.0 0.0 0:06.88 migration/1
14 root 20 0 0 0 0 S 0.0 0.0 0:20.14 ksoftirqd/1
显示完整命令:
top -c
3.3.3 kill
kill [-9]进程代号:终止指定代号的进程,-9表示强行终止。
使用kill命令时,最好只终止由当前用户开启的进程,而不要终止root身份开启的进程,否则可能导致系统经常要查看进程的信息,包括进程的是否已经消亡。
3.3.4 pgrep
通过pgrep来获得正在被调度的进程的相关信息。pgrep通过匹配其程序名,找到匹配的进程
| 选项 | 描述 |
|---|---|
| -o | 仅显示找到的最小(起始)进程号; |
| -n | 仅显示找到的最大(结束)进程号; |
| -l | 显示进程名称; |
| -P | 指定父进程号; |
| -g | 指定进程组; |
| -t | 指定开启进程的终端; |
| -f | 进程全名 |
| -u | 指定进程的有效用户ID。 |
查看指定名称的进程信息:
[root@VM-0-17-centos server]# pgrep ngsp-cmc
8564
-n当匹配多个进程时,显示进程号最大的那个:
[root@VM-0-17-centos server]# pgrep -n ngsp-cmc
8564
3.4 磁盘信息(df、du)
3.4.1 df
Linux df(英文全拼:disk free) 命令用于显示目前在Linux系统上的文件系统磁盘使用情况统计。
df [选项]... [FILE]...
| 参数 | 含义 |
|---|---|
| -a | 包含所有的具有 0 Blocks 的文件系统 |
| --block-size= | 使用 {SIZE} 大小的 Blocks |
| -i | Inodes 列出 inode 资讯,不列出已使用 block |
| -h | 使用人类可读的格式 |
显示文件系统的磁盘使用情况统计:
[root@longmax2002 zy]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda1 61794300 53811240 4821056 92% /
devtmpfs 1929864 0 1929864 0% /dev
tmpfs 1940460 0 1940460 0% /dev/shm
tmpfs 1940460 676 1939784 1% /run
tmpfs 1940460 0 1940460 0% /sys/fs/cgroup
tmpfs 388096 0 388096 0% /run/user/0
其中:
- 第一列指定文件系统的名称;
- 第二列指定一个特定的文件系统
1K-块1K是1024字节为单位的总内存。用和可用列正在使用中,分别指定的内存量。 - 使用列指定使用的内存的百分比,
- 而最后一栏安装在指定的文件系统的挂载点;
用一个-i选项的df命令的输出显示inode信息而非块使用量。
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/vda1 3932160 83009 3849151 3% /
devtmpfs 482466 332 482134 1% /dev
tmpfs 485115 2 485113 1% /dev/shm
tmpfs 485115 480 484635 1% /run
tmpfs 485115 16 485099 1% /sys/fs/cgroup
tmpfs 485115 1 485114 1% /run/user/0
-h选项,通过它可以产生可读的格式df命令的输出:
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 59G 52G 4.6G 92% /
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 676K 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
tmpfs 379M 0 379M 0% /run/user/0
3.4.2 du
Linux du(英文全拼:disk usage)命令用于显示目录或文件的大小。du会显示指定的目录或文件所占用的磁盘空间。
显示目录或者文件所占空间:
[root@bogon194 shell]# du
4 ./test
32 .
只显示当前目录下面的子目录的目录大小和当前目录的总的大小,最下面的32为当前目录的总大小
显示指定文件所占空间:
du log2012.log
方便阅读的格式显示test目录所占空间情况:
[root@bogon194 shell]# du -h
4.0K ./test
32K .
3.5 查看网卡信息
ifconfig:查看/配置计算机当前的网卡配置信息
[root@longmax2002 yuncang]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet xxx.xx.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether 02:42:e7:7c:76:74 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet xxx.xx.xxx.47 netmask 255.255.240.0 broadcast xxx.xx.xxx.255
ether 00:16:3e:08:09:35 txqueuelen 1000 (Ethernet)
RX packets 32758819 bytes 10010046741 (9.3 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 27094266 bytes 8748881502 (8.1 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 260063355 bytes 71415552425 (66.5 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 260063355 bytes 71415552425 (66.5 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
提示:一台计算机中有可能会有一个物理网卡和多个虚拟网卡,在Linux中物理网卡的名字通常以ensX、ethx表示 ,127.0.0.1被称为本地回环/环回地址,一般用来测试本机网卡是否正常。
ping一般用于检测当前计算机到目标计算机之间的网络 是否通畅,数值越大,速度越慢。
# 检测到目标主机是否连接正常
$ ping IP地址
# 检测本地网卡工作正常
$ ping 127.0.0.1
3.6 netstat
Netstat命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade连接,多播成员 (Multicast Memberships) 等等。
常见参数:
-a (all)显示所有选项,默认不显示LISTEN相关;-t (tcp)仅显示tcp相关选项;-u (udp)仅显示udp相关选项;-n拒绝显示别名,能显示数字的全部转化成数字;-l仅列出有在Listen(监听) 的服务状态;-p显示建立相关连接的程序名;-r显示路由信息,路由表;-e显示扩展信息,例如uid等;`-s按各个协议进行统计;-c每隔一个固定时间,执行该netstat命令。
提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到.。
列出所有端口 (包括监听和未监听的):
[root@bogon194 ~]# netstat -a | more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:afs3-fileserver 0.0.0.0:* LISTEN
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN
tcp 0 0 bogon194:41320 10.64.200.219:29010 TIME_WAIT
tcp 0 0 bogon194:42544 10.64.200.219:29010 TIME_WAIT
tcp 0 0 bogon194:60106 10.64.200.219:29010 TIME_WAIT
列出所有tcp端口:
[root@bogon194 ~]# netstat -at | more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:afs3-fileserver 0.0.0.0:* LISTEN
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN
tcp 0 0 bogon194:41320 10.64.200.219:29010 TIME_WAIT
tcp 0 0 bogon194:42544 10.64.200.219:29010 TIME_WAIT
tcp 0 0 bogon194:57808 10.64.200.219:29010 TIME_WAIT
列出所有udp端口netstat -au:
[root@bogon194 ~]# netstat -au | more
列出所有监听tcp端口:
[root@bogon194 ~]# netstat -lt | more
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:afs3-fileserver 0.0.0.0:* LISTEN
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN
tcp6 0 0 [::]:6379 [::]:* LISTEN
tcp6 0 0 [::]:6540 [::]:* LISTEN
四、用户权限相关命令
4.1 组管理
普通用戶创建组 / 删除组 的终端命令都需要通过sudo执行:
| 命令 | 作用 |
|---|---|
| groupadd 组名 | 添加组 |
| groupdel 组名 | 删除组 |
| cat /etc/group | 确认组信息 |
| chgrp -R 组名 文件/目录名 | 递归修改文件/目录的所属组 |
组信息保存在/etc/group文件中,/etc目录是专门用来保存系统配置信息的目录。
4.2 用户管理
普通用户创建用户 / 删除用户 / 修改其他用户密码 的终端命令都需要通过sudo执行。
| 命令 | 作用 |
|---|---|
| useradd -m -g 组名 新建用户名 | 添加新用户 -m 自动建立用户home路径 -g 指定用户所在的组,否则会新建一个同名的组 |
| passwd 用户名 | 设置用户密码 如果是普通用户,直接用passwd可以修改自己的账号密码 |
| userdel -r 用户名 | 删除用户 -r 自动删除用户home路径 |
| cat /etc/passwd | grep 用户名 |
4.3 查看用户信息
id[用户名]:查看用户UID和GID信息。
[root@longmax2002 yuncang]# id root
uid=0(root) gid=0(root) groups=0(root)
who:查看当前所有登录的用户列表;
[root@longmax2002 yuncang]# who
root pts/1 2021-09-29 13:12 (xxx.xxx.xxxx.xx)
whoami:查看当前登录用户的账户名。
[root@longmax2002 yuncang]# whoami
root
4.4 which
which命令可以查看执行命令所在位置,例如:
which ls
# 输出
# /bin/ls
which useradd
# 输出
# /usr/sbin/useradd
4.5 切换用户
su -用户名:切换用户,并且切换目录;
exit: 退出当前登录用户。
4.6 修改文件权限
chown:修改拥有者;
chgrp:修改组;
chmod:修改权限。
# 修改文件|目录的拥有者
chown 用户名 文件名|目录名
# 递归修改文件|目录的组
chgrp -R 组名 文件名|目录名
# 递归修改文件权限
chmod -R 755 文件名|目录名
五、远程管理相关命令
5.1 关机/重启
shutdown:关机/重新启动。
# 重新启动操作系统,其中 now 表示现在
$ shutdown -r now
# 立刻关机,其中 now 表示现在
$ shutdown now
# 系统在今天的 20:25 会关机
$ shutdown 20:25
# 系统再过十分钟后自动关机
$ shutdown +10
# 取消之前指定的关机计划
$ shutdown -c
5.2 ssh命令
在Linux中SSH是 非常常用 的工具,通过SSH客户端 我们可以连接到运行了SSH服务器的远程机器上。
ssh的简单使用:
ssh [-p port] user@remote
user是在远程机器上的用户名,如果不指定的话默认为当前用户;remote是远程机器的地址,可以是IP/域名,或者是 后面会提到的别名;port是SSH Server监听的端口,如果不指定,就为默认值22;
5.3 scp命令
scp就是secure copy,是一个在Linux下用来进行 远程拷贝文件 的命令,需要注意的是,在指定端口时用的是大写的-P而不是小写的。
# 把本地当前目录下的 01.py 文件 复制到远程目录下的 Desktop/01.py
# 注意:`:`后面的路径如果不是绝对路径,则以用户的Home目录作为参照路径
scp -P port 01.py user@remote:Desktop/01.py
# 把远程目录下的Desktop/01.py 文件 复制到本地当前目录下的 01.py
scp -P port user@remote:Desktop/01.py 01.py
# 加上 -r 选项可以传送文件夹
# 把当前目录下的demo文件夹 复制到远程目录Desktop
scp -r demo user@remote:Desktop
# 把远程目录Desktop下的文件复制到当前目录下的demo文件夹
scp -r user@remote:Desktop demo
| 选 项 | 含义 |
|---|---|
| -r | 若给出的源文件是目录文件,则 scp 将递归复制该目录下的所有子目录和文件,目标文件必须为一个目录名 |
| -P | 若远程 SSH 服务器的端口不是 22,需要使用大写字母 -P 选项指定端口 |
六、简单案例
6.1 通过端口停止进程
#!/bin/bash
port=30999
#根据端口号查找对应的pid
pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }');
#杀掉对应的进程(如果pid长度不为0)
if [ -n "$pid" ]; then
echo $pid;
kill -9 $pid;
fi
首先利用netstat -nlp,列出所有监听端口,然后通过grep :$port过滤满足的行数据。利用awk '{print $7}'输出文本第7项:

最后利用awk -F,对字符串按照/拆分,并获取得到pid。
6.2 start/stop/restart服务脚本
#! /bin/bash
# 获取工作路径
WORKSPACE=`cd "$(dirname "$0")"/ || exist; pwd` #等价$(...)
cd $WORKSPACE
# 创建临时目录
mkdir -p var
# 软件信息
app=app
pid_file=var/app.pid
log_file=var/app.log
# 从pid文件获取进程pid
function check_pid() {
if [ -f $pid_file ];then
pid=`cat $pid_file`
if [[ -n $pid ]]; then
return `pgrep -f $app | grep -cv "PID TTY"`
fi
fi
return 0
}
# 启动服务
function start() {
check_pid
# 获取进程pid
pid=$?
if [ $pid -gt 0 ];then
echo -n "$app now is running already, pid="
echo $pid_file
return 1
fi
# 启动进程命令
nohup ./$app web &> $log_file &
sleep 1
pid=`pgrep -f $app | grep -cv "PID TTY"`
if [ $pid -gt 0 ];then
echo $! > $pid_file
echo "$app started..., pid=$!"
else
echo "$app failed to start."
return 1
fi
}
# 停止服务
function stop() {
pgrep -f $app | xargs kill -9
rm -f $pid_file
echo "$app stopped..."
}
# 重启服务
function restart() {
stop
sleep 1
start
}
# 获取进程状态
function status() {
check_pid
pid=$?
if [ $pid -gt 0 ];then
echo started
else
echo stoped
fi
}
# 帮助
function help() {
echo "$0 start|stop|restart|status"
}
if [ "$1" == "" ]; then
help
elif [ "$1" == "stop" ];then
stop
elif [ "$1" == "start" ];then
start
elif [ "$1" == "restart" ];then
restart
elif [ "$1" == "status" ];then
status
else
help
fi
6.3 nginx安装
以下安装脚本适配centos和ubuntu系统;
#!/bin/bash
#installpath应用安装目录
installpath=/data
function printPercent()
{
x=`expr $2 \* 100`
p=`expr $x / $1`
echo "percent:$p%"
sleep 1
}
#判断是否有nginx在运行
pids=`ps -ef | grep nginx | grep -v grep | grep -v ${installpath}| awk '{print $2}'`
#正在运行 获取安装路径和配置文件路径
if [[ ${pids} ]];then
echo "nginx已经安装,并且正在运行"
# 获取安装路径和配置文件路径
for i in ${pids}; do
echo $i
# 获取nginx安装路径
path=`ls -l /proc/${i}/exe | awk '{print $11}'`
if [[ -z $path ]];then
echo "无法获取nginx安装路径"
exit 1
else
nginxPath=$path
echo "获取nginx可执行文件路径 $nginxPath"
nginxConfig=`${nginxPath} -t 2>&1 | grep configuration`
if [[ ! -z $nginxConfig ]];then
nginxtmp="${nginxConfig%%test*}"
nginxConfigPath="${nginxtmp##*file}"
echo "获取nginx配置文件 $nginxConfigPath"
fi
fi
break
done
exit 1
fi
# ------------------------------------------- 安装nginx -------------------------------------------i
#成功完成步骤数
all=5
cd ${installpath}/components
echo "-----------------------------------pcre开始安装-----------------------------------------"
tar -zxvf pcre-8.45.tar.gz
cd pcre-8.45
./configure --prefix=${installpath}/pcre
make
make install # 分开 不分开可能异常
if [[ $? != 0 ]] ; then
echo "pcre安装失败"
exit 1
else
echo "pcre安装成功"
fi
printPercent $all 1
cd ..
echo "-----------------------------------openssl开始安装-----------------------------------------"
tar -zxvf openssl-fips-2.0.16.tar.gz
cd openssl-fips-2.0.16
./config --prefix=${installpath}/openssl
make
make install
# 麒麟系统可能安装失败
if [[ $? != 0 ]] ; then
echo "openssl安装失败(可忽略)"
# 麒麟3.3会安装失败 忽略失败。没有影响
else
echo "openssl安装成功"
fi
printPercent $all 2
cd ..
echo "-----------------------------------zlib开始安装-----------------------------------------"
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure --prefix=${installpath}/zlib
make
make install
if [[ $? != 0 ]] ; then
echo "zlib安装失败"
exit 1
else
echo "zlib安装成功"
fi
printPercent $all 3
cd ..
echo "-----------------------------------nginx开始安装-----------------------------------------"
tar -zxvf nginx-1.12.0.tar.gz
cd nginx-1.12.0
./configure --prefix=${installpath}/nginx --with-http_ssl_module --with-cc-opt="-Wno-error"
make
make install
if [[ $? != 0 ]] ; then
echo "nginx安装失败"
exit 1
else
echo "nginx安装成功"
fi
printPercent $all 4
# 记录本次安装路径
echo "Record the installation info."
echo "记录本次安装信息"
printPercent $all 5
exit 0
将当前install.sh脚本和components文件拷贝到/data路径下,components包下载路径如下:https://files.cnblogs.com/files/zyly/nginx-components.rar,然后运行安装脚本即可安装nginx。
注意:在较新的系统上,crypt_data 结构体中没有 current_salt 成员。这可能是由于使用的C库(如glibc)版本更新导致的。升级nginx版本:新版本的nginx已经修复了这个问题。
cd /data/components/
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -xzf nginx-1.24.0.tar.gz
# 修改install.sh脚本中nginx版本信息
6.4 mysql安装
以下安装脚本适配centos和ubuntu系统;
# /bin/bash
# 参考 https://blog.csdn.net/atongmu2017/article/details/90610444
# mysql安装包路径
mysql_tar=/data/mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz
install_path=/data
mysql_pwd=test123!@#
if [[ ! -f ${mysql_tar} ]];then
echo 'mysql安装包不存在'
exit 0
fi
if [[ -d ${install_path}/mysql ]];then
echo 'mysql已经安装..................'
exit 0
fi
#解压
echo '开始解压mysql安装包................'
tar -xvf ${mysql_tar}
mv mysql-8.0.13-linux-glibc2.12-x86_64 mysql
mv mysql ${install_path}
# 创建用户和用户组
echo '开始创建用户和用户组..................'
cd ${install_path}
groupadd mysql
useradd -r -g mysql mysql
cd mysql
chown -R mysql:mysql ./
passwd mysql ${mysql_pwd}
#初始化数据库,并会自动生成随机密码,记下等下登陆要用
echo '开始初始化数据库...................'
mkdir data
password=`bin/mysqld --initialize --user=mysql --basedir=./ --datadir=./data 2>&1 | grep 'root@localhost:' | awk '{print $13}' `
if [[ $? != 0 ]] ; then
echo 'mysql安装失败'
else
echo 密码是${password}
fi
#修改/usr/local/mysql当前目录得用户
chown -R root:root ./
chown -R mysql:mysql data
#开始配置/etc/my.cnf
mysql_cnf=/etc/my.cnf
if [[ -f ${mysql_cnf} ]];then
echo ${mysql_cnf}文件已经存在
mv ${mysql_cnf} ${mysql_cnf}.bak
fi
echo 开始创建${mysql_cnf}......
touch ${mysql_cnf}
echo "[mysqld]" > ${mysql_cnf}
echo "basedir = ${install_path}/mysql" >> ${mysql_cnf}
echo "datadir = ${install_path}/mysql/data" >> ${mysql_cnf}
echo "socket = /tmp/mysql.sock" >> ${mysql_cnf}
echo "log-error = ${install_path}/mysql/data/error.log" >> ${mysql_cnf}
echo "pid-file = ${install_path}/mysql/data/mysql.pid" >> ${mysql_cnf}
echo "tmpdir = /tmp" >> ${mysql_cnf}
echo "port = 3306" >> ${mysql_cnf}
echo "max_allowed_packet=32M" >> ${mysql_cnf}
echo "default-authentication-plugin = mysql_native_password" >> ${mysql_cnf}
echo "log_bin_trust_function_creators = ON" >> ${mysql_cnf}
echo "sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES" >> ${mysql_cnf}
#开始自启动
echo '设置mysql开机自启动........'
cd support-files
cp mysql.server /etc/init.d/mysql
chmod +x /etc/init.d/mysql
if [[ -f ${install_path}/mysql/lib ]];then
echo ${install_path}/mysql/lib文件已经存在
else
echo "${install_path}/mysql/lib" >> /etc/ld.so.conf
fi
#配置环境变量
echo "export PATH="'$PATH'":${install_path}/mysql/bin:${install_path}/mysql/lib" >> /etc/profile
source /etc/profile
# ubuntu系统需要执行 使用update-rc.d命令将MySQL服务添加到开机自启动(对于SysVinit系统)
update-rc.d mysql defaults
#启动服务
echo `service mysql start`
#连接数据库
mysql -u root -p ${password}
alter user 'root'@'localhost' identified by "${mysql_pwd}";
#开启navcat远程连接
use mysql;
select host, user, authentication_string, plugin from user;
update user set host='%' where user='root';
flush privileges;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY "${mysql_pwd}";
FLUSH PRIVILEGES;
exit;
将当前install.sh脚本和mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz文件拷贝到/data路径下,mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz包下载路径如下:https://pan.baidu.com/s/1HTwF8nVxrg1JCUt5MEOxbg?pwd=j9nr 提取码:j9nr,然后运行安装脚本即可安装mysql。
6.5 postgres安装
以下安装脚本适配centos和ubuntu系统;
#!/bin/bash
# 参考 http://www.kuazhi.com/post/444556.html
# postgres安装包路径
postgres_tar=/data/postgresql-10.21.tar.gz
install_path=/data/postgres
postgres_pwd=postgres
postgres_data=/var/lib/pgsql/data
if [[ ! -f ${postgres_tar} ]];then
echo 'postgres安装包不存在'
exit 1
fi
if [[ -d ${install_path} ]];then
echo 'postgres已经安装..................'
exit 0
fi
# 安装依赖
echo '安装依赖库................'
apt update
apt install -y libreadline-dev zlib1g-dev flex bison
# 解压
echo '开始解压postgres安装包................'
tar -zxf ${postgres_tar}
# 开始编译安装
echo '开始编译安装postgres................'
cd postgresql-10.21
./configure --prefix=${install_path}
make
make install
if [[ $? != 0 ]] ; then
echo "postgres安装失败"
exit 1
else
echo "postgres安装成功"
fi
# 创建用户和用户组
echo '开始创建用户和用户组..................'
groupadd postgres || echo "postgres组已存在"
useradd -r -g postgres postgres || echo "postgres用户已存在"
chown -R postgres:postgres ${install_path}
# 设置postgres用户密码
echo "postgres:${postgres_pwd}" | chpasswd
# 建立database cluster目标文件夹
echo '建立database cluster目标文件夹...................'
mkdir -p ${postgres_data}
chown -R postgres:postgres ${postgres_data}
chmod 700 ${postgres_data}
# 环境变量设置
postgres_home="/home/postgres"
profile="${postgres_home}/.bashrc"
mkdir -p ${postgres_home}
chown -R postgres:postgres ${postgres_home}
cat > ${profile} << EOF
export PGDATA=${postgres_data}
export PATH=${install_path}/bin:\$PATH
export LD_LIBRARY_PATH=${install_path}/lib:\$LD_LIBRARY_PATH
EOF
chown postgres:postgres ${profile}
# 创建database cluster
echo '创建database cluster........'
sudo -u postgres ${install_path}/bin/initdb -D ${postgres_data}
if [[ $? != 0 ]] ; then
echo "数据库初始化失败"
exit 1
else
echo "数据库初始化成功"
fi
# 配置可以远程访问
echo "配置远程访问................"
echo "listen_addresses = '*'" >> ${postgres_data}/postgresql.conf
# 添加认证规则
echo "host all all 0.0.0.0/0 trust" >> ${postgres_data}/pg_hba.conf
# 启动数据库实例
echo '启动数据库实例................'
sudo -u postgres ${install_path}/bin/pg_ctl start -l ${postgres_data}/pgsql.log -D ${postgres_data}
#关闭数据库实例
#sudo -u postgres ${install_path}/bin/pg_ctl stop -D ${postgres_data}
#重启
#sudo -u postgres ${install_path}/pg_ctl restart -D ${postgres_data}
if [[ $? != 0 ]] ; then
echo "数据库启动失败,检查日志: ${postgres_data}/pgsql.log"
exit 1
else
echo "数据库启动成功"
fi
# 设置postgres用户密码
echo "设置数据库用户密码................"
sleep 5 # 等待数据库完全启动
sudo -u postgres ${install_path}/bin/psql -c "ALTER USER postgres PASSWORD '${postgres_pwd}';"
echo "PostgreSQL 安装完成!"
echo "安装路径: ${install_path}"
echo "数据目录: ${postgres_data}"
echo "连接命令: psql -h localhost -U postgres -d postgres"
将当前install.sh脚本和postgresql-10.21.tar.gz文件拷贝到/data路径下,postgresql-10.21.tar.gz包下载路径如下: https://pan.baidu.com/s/17kyuZCV46nI7lxkFdbtMow?pwd=hnqd 提取码: hnqd,然后运行安装脚本即可安装postgresql。
6.6 postgres数据库定时备份和还原
6.6.1 创建备份脚本
backup_postgres.sh:
#!/bin/bash
# 配置参数
BACKUP_ROOT="/data/backup"
DB_NAME="postgres"
DB_HOST="127.0.0.1"
DB_USER="postgres"
DB_PASSWORD="postgres"
BACKUP_USER="postgres" # 执行备份的系统用户
DB_PORT="5432"
RETENTION_DAYS=3
INSTALL_PATH="/data/postgres"
# 创建目录结构
DAILY_DIR="${BACKUP_ROOT}/daily"
WEEKLY_DIR="${BACKUP_ROOT}/weekly"
MONTHLY_DIR="${BACKUP_ROOT}/monthly"
LOG_FILE="${BACKUP_ROOT}/backup.log"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
FILENAME="${DB_NAME}_${TIMESTAMP}.dump"
# 创建备份目录
mkdir -p {${DAILY_DIR},${WEEKLY_DIR},${MONTHLY_DIR}}
# 日志函数
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> ${LOG_FILE}
}
# 备份函数
perform_backup() {
local
log "开始备份: ${FILENAME}"
# 执行备份
sudo -u ${BACKUP_USER} bash -c "export PGPASSWORD=${DB_PASSWORD} && ${INSTALL_PATH}/bin/pg_dump -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} --schema=public -O -w -F c -b -v -f /tmp/${FILENAME}"
# 检查备份是否成功
if [ $? -eq 0 ] && [ -f "/tmp/${FILENAME}" ]; then
log "备份成功 - ${FILENAME}"
else
log "备份失败 - ${FILENAME}"
exit 1
fi
sudo mv /tmp/${FILENAME} ${DAILY_DIR}/${FILENAME}
# 压缩备份
cd ${DAILY_DIR}
tar -zcvf ${FILENAME}.tar.gz ${FILENAME}
rm -rf ${FILENAME}
log "数据库备份完成: ${FILENAME}.tar.gz"
}
# 清理旧备份
cleanup_old_backups() {
# 删除旧备份
log "清理 ${DAILY_DIR} 中超过 ${RETENTION_DAYS} 天的备份"
find ${DAILY_DIR} -name "${DB_NAME}_*.dump.tar.gz" -mtime +${RETENTION_DAYS} -delete
}
# 主函数
main() {
log "================== 开始备份任务 =================="
# 检查磁盘空间
available_space=$(df "${BACKUP_ROOT}" | awk 'NR==2 {print $4}')
if [[ "$available_space" -lt 10485760 ]]; then # 小于10GB
log "错误: 磁盘空间不足"
exit 1
fi
perform_backup
cleanup_old_backups
log "================== 备份任务完成 =================="
}
# 执行主函数
main
6.6.2 设置执行权限
chmod +x backup_postgres.sh
6.6.3 配置cron定时任务
# 编辑 cron 任务
crontab -e
# 添加以下行(每天凌晨2点执行)
0 2 * * * /data/backup/backup_postgres.sh
6.6.4 数据库还原
执行还原操作需要谨慎,只有特定情景可能需要还原,脚本restore_postgres.sh:
#!/bin/bash
# 配置参数
BACKUP_ROOT="/data/backup"
DB_NAME="postgres" # 还原的目标库
DB_HOST="127.0.0.1"
DB_USER="postgres"
DB_PASSWORD="postgres"
BACKUP_USER="postgres" # 执行备份的系统用户
DB_PORT="5432"
INSTALL_PATH="/data/postgres"
# 创建目录结构
DAILY_DIR="${BACKUP_ROOT}/daily"
LOG_FILE="${BACKUP_ROOT}/restore.log"
# 日志函数
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> ${LOG_FILE}
}
log "================== 开始恢复任务 =================="
# 进入工作目录
cd ${DAILY_DIR}
# 查找最新的文件
latest_file=$(ls -t "${DAILY_DIR}" | grep "${DB_NAME}_.*.dump.tar.gz" | head -n 1)
# 判断文件是否存在
if [ -z "${latest_file}" ]; then
log "数据库${DB_NAME}备份文件不存在"
else
log "最新的数据库${DB_NAME}备份文件是: ${latest_file}"
fi
# 获取文件名
dump="${latest_file%.tar.gz}"
# 解压并保存原文件
tar -zxvf ${latest_file}
# 移动到临时目录
mv ${dump} /tmp/${dump}
# postgres使用pg_restore
sudo -u ${BACKUP_USER} bash -c "export PGPASSWORD=${DB_PASSWORD} && ${INSTALL_PATH}/bin/pg_restore -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} --no-owner /tmp/${dump}"
# 检查还原是否成功
if [ -f "/tmp/${dump}" ]; then
log "还原成功 - /tmp/${dump}"
else
log "还原失败 - /tmp/${dump}"
exit 1
fi
# 删除文件
sudo rm -rf /tmp/${dump}
log "================== 恢复任务完成 =================="
参考文章

浙公网安备 33010602011771号