在前面的文章中,截止到 ​​微服务系列:分布式日志 ELK 搭建指南​​ 这篇,我们终于算是将微服务系列给基本学完了,一时间难以决定接下来要写些什么东西。

想了想还是决定写几篇 ​​Linux​​​ 相关命令的文章,毕竟平时也经常去 ​​Linux​​​ 服务器上部署项目,你可能会问,部署这块不应该是运维的工作嘛?不好意思,小公司没有专业运维,都是我们开发自己来。所以,熟悉一些常用的 ​​Linux​​ 命令还是很有必要的。

当然,最主要的目的还是自己写下来,印象会更深刻,并且方便以后查阅,毕竟收藏的别人的文章基本都在收藏夹里吃灰哈哈,不如自己动手写下来。本篇可能暂时不会放太多命令,但应该会持续更新的。

一、文件和目录

贴一张 ​​Linux​​ 系统的各个目录的含义,图片来自 ​​2万字系统总结,带你实现 Linux 命令自由?​​

开发必备的常用 Linux 命令整理_shell

1. cd 命令

最基本的、最常用的命令之一,用于切换目录,参数既可以是绝对路径,也可以是相对路径。

cd /      # 切换到根目录
cd ~ # 切换到 /root 目录
cd .. # 切换到上级目录
cd /usr/local/ # 切换到目录 /usr/local(绝对路径)
cd ./java/ # 切换到当前目录下的 java 目录中,“.” 表示当前目录,或者直接 cd java/ 效果一样
cd ../java/ # 切换到上层目录中的 java 目录中,“.” 表示上一层目录

2. ls 命令

同样是最基本、最常用的命令之一,list 的意思,​​查看当前文件夹下的内容​​,它的参数很多,只贴几个较为常用的:

-a    # 列出当前文件夹下全部的文件,连同隐藏文件(开头为.的文件)一起列出来
-l # 列出当前文件夹下文件的详细信息,包含文件的属性与权限数据等,ll 命令相当于此命令的快捷键
-h # 将文件容量以较易读的方式(GB,kB等)列出来
-R # 连同子目录的内容一起列出(递归列出)
-i # 按文件最近一次修改时间排序

注:这些参数可以组合使用,比如

ls -lh    # 在列出文件的详细信息同时查看文件的大小
ls -alht # 这个组合命令你应该可以推断出来它的意思

3. cp 命令

用于复制文件,copy 的意思,常用参数如下:

-a    # 将文件的特性一起复制
-p # 连同文件的属性一起复制,而非使用默认方式,与 -a 相似,常用于备份
-i # 若目标文件已经存在时,在覆盖时会先询问操作的进行
-r # 递归持续复制,用于目录的复制行为
-u # 目标文件与源文件有差异时才会复制

例如:

cp -a file1 file2       # 连同文件的所有特性把文件file1复制成文件file2
cp file1 file2 file3 dir # 把文件file1、file2、file3复制到目录dir中

4. mv 命令

用于移动文件、目录、或者重命名,move 的意思,常用参数如下:

-f    # force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
-i # 若目标文件已经存在,就会询问是否覆盖
-u # 若目标文件已经存在,且比目标文件新,才会更新

例如:

mv file1 file2 file3 dir  # 把文件 file1、file2、file3 移动到目录 dir 中
mv file1 file2 # 把文件 file1 重命名为 file2

5. rm 命令

用于删除文件或目录,remove 的意思,由于 ​​Linux​​ 下没有回收站,一旦删除非常难恢复,因此需要谨慎操作,常用参数如下:

-f    # 就是 force 的意思,忽略不存在的文件,不会出现警告消息
-i # 互动模式,在删除前会询问用户是否操作
-r # 递归删除,最常用于目录删除,它是一个非常危险的参数

例如:

rm -i file    # 删除文件 file,在删除之前会询问是否进行该操作
rm -rf dir # 强制删除目录 dir 中的所有文件

6. pwd 命令

显示当前目录的路径

开发必备的常用 Linux 命令整理_java_02

7. which 命令

查看命令的可执行文件所在路径,例如:

which java

开发必备的常用 Linux 命令整理_java_03

8. du 命令

用于显示目录或文件的大小,disk usage 的意思,常用参数如下:

-h    # 以K,M,G为单位,提高信息的可读性
-a # 同时列举出目录下文件的大小信息
-s # 只显示总计大小,不显示具体信息
-b # 显示目录或文件大小时,以byte为单位

例如:

开发必备的常用 Linux 命令整理_shell_04

9. cat 命令

一次性显示文件所有内容,更适合查看小的文件,concatenate 的意思,更官方一点的说法是 ​​用于连接文件并打印到标准输出设备上。​​常用参数如下:

-n    # 由 1 开始对所有输出的行数编号
-b # 和 -n 相似,只不过对于空白行不编号

例如:

cat -n info.log   # 显示 info.log 的所有内容,并加上行号
cat -n textfile1 > textfile2 # 把 textfile1 的文档内容加上行号后输入 textfile2 这个文档里,原 textfile2 文档内容会被覆盖

10. less 命令

分页显示文件内容,更适合查看大的文件。

less info.log

快捷操作:

  • 空格键:前进一页(一个屏幕);
  • ​b​​ 键:后退一页;
  • 回车键:前进一行;
  • ​y​​ 键:后退一行;
  • 上下键:回退或前进一行;
  • ​d​​ 键:前进半页;
  • ​u​​ 键:后退半页;
  • ​q​​​ 键:停止读取文件,中止 ​​less​​ 命令;
  • ​=​​ 键:显示当前页面的内容是文件中的第几行到第几行以及一些其它关于本页内容的详细信息;
  • ​h​​ 键:显示帮助文档;
  • ​/​​​ 键:进入搜索模式后,按 ​​n​​​ 键跳到一个符合项目,按 ​​N​​ 键跳到上一个符合项目,同时也可以输入正则表达式匹配。

例如:

ps -ef | less     # ps查看进程信息并通过less分页显示

还有一个命令 ​​more​​​ 和 ​​less​​​ 对应,只是 ​​more​​​ 不能后退,日常使用中用 ​​less​​ 就够了。

11. find 命令

用于查找文件,它会去遍历你的实际硬盘进行查找,而且它允许我们对每个找到的文件进行后续操作,功能非常强大。

find <何处> <何物> <做什么>
  • 何处:指定在哪个目录查找,此目录的所有子目录也会被查找。
  • 何物:查找什么,可以根据文件的名字来查找,也可以根据其大小来查找,还可以根据其最近访问时间来查找。
  • 做什么:找到文件后,可以进行后续处理,如果不指定这个参数, ​​find​​ 命令只会显示找到的文件。

​find​​ 的使用也相对较为复杂,参数也比较多,我也不想全部列出来,只贴几个实际使用的例子好了:

find -name "info.log"     # 在当前目录以及子目录下查找名字叫做 info.log 的文件
find / -name "info.log" # 整个硬盘下查找 info.log
find /root/ytb -name "*.log" # 在指定目录下查找 *.log 等文件,* 表示所有

其他还有 ​​根据文件最近访问时间查找、操作查找结果​​ 等一般也用不到,就不贴了。

12. file 命令

这个命令比较简单,用于辨识文件类型。例如:

开发必备的常用 Linux 命令整理_java_05

13. tar 命令

该命令用于对文件进行打包或者解压缩,常用参数如下:

-c      # 新建打包文件
-t # 查看打包文件的内容含有哪些文件名
-x # 解打包或解压缩的功能,可以搭配-C(大写)指定解压的目录,注意-c,-t,-x不能同时出现在同一条命令中
-z # 通过gzip的支持进行压缩/解压缩
-v # 在压缩/解压缩过程中,将正在处理的文件名显示出来
-f filename # filename为要处理的文件

​tar​​ 的相关参数也非常多,看下面几个例子也就简单的会用了:

tar -czvf test.tar.gz info.log    # 压缩 info.log 文件到 test.tar.gz
tar -zxvf test.tar.gz # 解压缩 test.tar.gz
tar -tzvf test.tar.gz # 列出压缩文件内容

开发必备的常用 Linux 命令整理_shell_06

除了 ​​tar​​​ 命令之外,​​linux​​​ 还有 ​​zip/unzip​​​ 命令来压缩或者解压 ​​.zip​​​ 文件(​​zip​​​ 压缩文件一般来自于 ​​windows​​ 操作系统)

如果没有这两个命令,可以安装一下:

yum install zip 
yum install unzip

14. head 命令

显示文件的开头几行(默认是10行)

head gc.log

开发必备的常用 Linux 命令整理_linux_07

参数:

  • ​-n​​​ 指定行数 ​​head -n 5 gc.log​

15. tail 命令

显示文件的结尾几行(默认是10行)

tail gc.log

开发必备的常用 Linux 命令整理_bash_08

参数:

  • ​-n​​​ 指定行数 ​​tail -n 5 gc.log​
  • ​-f​​​ 会每过1秒检查下文件是否有更新内容,​​tail -f gc.log​

实际开发中,我们经常去服务器上查看系统错误日志,一般会这样用

tail -f -n 500 info.log     # 实时查看最后 500 行日志

二、用户与权限

这两个东西实际上我还真用到过,比如说 ​​linux​​​ 系统上安装的 ​​elasticsearch​​​、​​kibana​​​ 等需要用非 ​​root​​ 用户才能启动。

1. su 命令

用于变更为其他使用者的身份,switch user 的意思。

su root     # 切换到 root 用户

2. useradd + passwd 命令

  • ​useradd​​ 添加新用户
  • ​passwd​​ 修改用户密码

这两个命令需要 ​​root​​ 用户权限

useradd es      # 添加一个 es 用户,添加完成后,在 /home 路径下可以查看到这个 es 目录
passwd es # 修改 es 用户的密码

3. userdel 命令

删除用户,需要 ​​root​​ 用户权限

userdel lion    # 只会删除用户名,不会从/home中删除对应文件夹
userdel lion -r # 会同时删除/home下的对应文件夹

4. sudo 命令

以 ​​root​​ 身份运行命令

5. chown 命令

改变文件的所有者,需要 ​​root​​ 身份才能运行,参数:

  • -R 递归设置子目录和子文件
chown -R es:es /usr/local/elasticsearch-8.0     # 把 elasticsearch-8.0 文件夹的用户和群组都改为 es

6. chmod 命令

修改访问权限,常用参数:

  • -R 递归地修改文件访问权限

这个命令还有一些深层次的东西,稍微复杂,我也不想再详细的讲解下去了,一般都是这样使用:

chmod 777 info.log        # 给 info.log 最高权限
chmod -R 777 /usr/local/java # 递归给 /usr/local/java/ 最高权限

三、文本操作

说到文本操作,最常用的还是 ​​grep​​ 命令了,在工作中进行部署项目的时候,需要 kill 掉某个进程时用到这个命令来查找进程号。

1. grep 命令

​grep​​ 命令用于查找文件里符合条件的字符串,换句话说是在文件中查找关键字,并显示关键字所在行。

例如:

grep export /etc/profile

开发必备的常用 Linux 命令整理_shell_09

常用参数:

  • -i ​​忽略大小写,​​grep -i path /etc/profile
  • -n ​​显示行号,​​grep -n path /etc/profile
  • -v ​​只显示搜索文本不在的那些行,​​grep -v path /etc/profile
  • -r ​​递归查找,​​​grep -r hello /etc​​,Linux 中还有一个 rgrep 命令,作用相当于​​grep -r

四、重定向、管道

学习重定向,我们需要了解 ​​Linux​​​ 中的 ​​标准输入​​​、​​标准输出​​​、​​标准错误输出​​。

名称

代码

操作符

标准输入(stdin)

0

< 或 <<

标准输出(stdout)

1

>, >>, 1> 或 1>>

标准错误输出(stderr)

2

2> 或 2>>

1. 输出重定向 ​​>​

​>​​​ 表示重定向到新的文件,我们在运行 ​​jar​​ 包的时候,经常会将日志重定向到一个特定目录的特定文件中,例如:

nohup java -jar cloud-system.jar > cloud-system.log &

注意:

使用 ​​>​​ 要注意,如果输出的文件不存在它会新建一个,如果输出的文件已经存在,则会覆盖。因此执行这个操作要非常小心,以免覆盖其它重要文件。

2. 输出重定向 ​​>>​

这个表示重定向到文件末尾,即将内容追加到文件的末尾,而不像 ​​>​​ 命令会直接覆盖文件内容。同样的,如果文件不存在,也会被创建。

所以,对于我们的项目的启动的日志,最好是使用 ​​>>​​ 命令,建议

nohup java -jar cloud-system.jar >> cloud-system.log &

3. 输出重定向 ​​2>​

标准错误输出,例如:

nohup java -jar cloud-system.jar > cloud-system.log 2> error.log &

启动后,标准输出写入文件 ​​cloud-system.log​​​ ,​​2> error.log​​​ 当发生错误时会写入 ​​error.log​​ 文件中。

4. 输出重定向 ​​2>>​

标准错误输出(追加到文件末尾)类似 ​​>>​​ 。

5. 输出重定向 ​​2>&1​

标准输出和标准错误输出都重定向都一个地方

nohup java -jar cloud-system.jar > info.log 2>&1 &

6. 管道 ​​|​

把两个命令连起来使用,一个命令的输出作为另外一个命令的输入。

说实话,管道这个命令的功能还是很强大的,我们直接来看例子

【实例 1】

ls | grep gc.log.00

开发必备的常用 Linux 命令整理_shell_10

此命令功能是查看文件 ​​gc.log.00​​ 是否存在于当前目录下。

即将 ​​ls​​​ 输出的内容当做 ​​grep​​ 命令的输入。

【实例 2】

cat gc.log | less

使用管道将 cat 命令的输出作为 less 命令的输入,这样就可以将 cat 命令的输出每次按照一个屏幕的长度显示。

【实例 3】

ps -ef | grep cloud-system.jar

这个命令平时使用的还是比较多的,​​ps -ef​​​ 命令是列出所有进程的意思,这个命令的意思就是 ​​查找出和 cloud-system.jar 有关的进程​

五、进程

1. ps 命令

用于显示当前系统中的进程,英文全拼: ​​process status​​​。​​ps​​​ 命令显示的进程列表不会随时间而更新,是静态的,是运行 ​​ps​​ 命令那个时刻的状态或者说是一个进程快照。

常用参数:

  • ​-ef​​ 列出所有进程;
  • ​-u​​ 列出此用户运行的进程;
  • ​-aux​​​ 通过 ​​CPU​​​ 和内存使用来过滤进程 ​​ps -aux | less​​ ;
  • ​-aux --sort -pcpu​​​ 按 ​​CPU​​​ 使用降序排列, ​​-aux --sort -pmem​​ 表示按内存使用降序排列
  • ​-axjf​​​ 以树形结构显示进程, ​​ps -axjf​​​ 它和 ​​pstree​​ 效果类似。

在 ​​管道​​ 中的【实例 3】中,我们用到了这个命令,是非常常用的。

ps -ef | grep cloud-system.jar

2. top 命令

获取进程的动态列表。

开发必备的常用 Linux 命令整理_java_11

  • 展示的这些进程是按照使用处理器 ​​%CPU​​ 的使用率来排序的。

3. kill 命令

结束一个进程, ​​kill + PID​​ 。

kill 11056      # 结束进程号为956的进程
kill 11056 11057 # 结束多个进程
kill -9 4568 # 强制结束进程

4. & 命令

启动后台进程,它的缺点是后台进程与终端相关联,一旦关闭终端,进程就自动结束了。

npm run dev &

5. nohup 命令

用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。英文全称:​​no hang up​​,

​nohup​​​ 命令,在默认情况下(非重定向时),会输出一个名叫 ​​nohup.out​​ 的文件到当前目录下

nohup npm run dev

​nohup​​​ 命令也可以和 ​​&​​ 结合使用,后台启动并可以退出终端,程序运行不会中断。

nohup npm run dev &

6. jobs 命令

显示当前终端后台进程状态。

开发必备的常用 Linux 命令整理_bash_12

注意:

jobs 是查看当前终端的后台进程状态,如果你退出终端,再次连接终端则看不到上一个被关闭终端的后台进程,但其实进程还在。

六、系统

1. halt 命令

关闭系统,需要 ​​root​​ 身份。

halt

2. reboot 命令

重启系统,需要 ​​root​​ 身份。

reboot

3. poweroff

直接运行即可关机,不需要 ​​root​​ 身份。

poweroff

暂时写到这里,后面应该会继续补充的。

文章参考:​​2万字系统总结,带你实现 Linux 命令自由​​