我的校招记录:校招笔记(零)_写在前面 ,以下是校招笔记总目录。

备注
算法能力(“刷题”) 这部分就是耗时间多练习,Leetcode-Top100 是很好的选择。 补充练习:codeTop
计算机基础(上)(“八股”) 校招笔记(一)__Java_Java入门 C++后端后续更新
校招笔记(一)__Java_面对对象
校招笔记(一)__Java_集合
校招笔记(一)__Java_多线程
校招笔记(一)__Java_锁
校招笔记(一)__Java_JVM
计算机基础(下)(“八股”) 校招笔记(二)__计算机基础_Linux&Git
校招笔记(三)__计算机基础_计算机网络
校招笔记(四)__计算机基础_操作系统
校招笔记(五)__计算机基础_MySQL
校招笔记(六)__计算机基础_Redis
校招笔记(七)__计算机基础_数据结构
校招笔记(八)__计算机基础_场景&智力题
校招笔记(九)__计算机基础_相关补充
项目&实习 主要是怎么准备项目,后续更新

二、Linux & Git

2.1 Linux

2.1.1 常用命令

  1. 查看80端口状态

    1
    netstat -ntulp | grep 80
    • -t : 指明显示TCP端口
    • -u : 指明显示UDP端口
    • -l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的程序)
    • -p : 显示进程标识符和程序名称,每一个套接字/端口都属于一个程序
    • -n : 不进行DNS轮询,显示IP(可以加速操作)
  2. 怎么查看指定端口是否开放

    通过 netstat 命令,注意加上-a参数,看是否有0.0.0.0:22 在被监听。

    image-20210906215822732

    通过lsof命令,如果没有任何显示,则端口没有被打开。

    image-20210906215941036

  3. 查看进程状态?怎么退出?怎么搜索进程?怎么查看某一个进程的内存和CPU使用情况

    • 所有进程状态

      1
      2
      ps -aux  # 内存中进程信息
      ps -l # 本次登陆所有的进程信息

      image-20210519183338193

    • 退出进程:

      exit

    • 搜索进程:

      ps -ef

      1
      ps -ef | grep <进程名>
      • -e相当于-a是全部列出,-f是显示UID等;
    • 查看指定进程(如kalfa)CPU和内存占用

      1
      ps -aux | grep java

      image-20210523171131744

      • 1.3是CPU占用率,12.7是内存占用率,943100是物理内存使用量

      还可以使用 top命令查看指定进程(PID)的内存和CPU使用率:

      1
      top -p 2913
  4. 查看占用指定端口的进程

    1
    lsof -i :8040

    这一步只能获取进程名,还要ps 命令进一步获取进程id

    如果要杀死相应进程:

    1
    kill -9 <进程id>
  5. 任务管理器(cpu占用率、内存占用率、进程)?

    1
    top

    总忘)还可以使用 top命令查看指定进程(PID)的内存和CPU使用率

    1
    top -p
  6. 内存使用情况 和 磁盘使用情况

    1
    free -m  # 内存使用情况

    磁盘使用情况

    1
    df -m

    -m : 以Mb为单位显示磁盘使用量和占用率

  7. 统计单词个数

    1
    grep -o <单词> <文件地址> | wc -l   # -l表示统计行数
  8. 修改用户权限及常用参数

    1
    chmod <参数(可选)> <模式> <文件/文件夹>

    常用参数:

    • -R :递归的修改文件夹下所有子文件/文件夹的所属用户

    【示例】如何修改 /test5/5.txt ,权限从rw-r--r-- —> r--rwxrwx

    1580875509098

    1
    2
    3
    4
    # 用户(U)权限[减去写]权限
    chmod u-w /test5/5.txt
    # 组(G)/其他用户(O)权限[加上写、执行]
    chmod go+wx /test5/5.txt

    1580875689076

  9. 查看文件的命令有哪些

    1
    2
    3
    4
    5
    6
    vi 文件名   #编辑方式查看,可修改
    cat 文件名 #显示全部文件内容
    more 文件名 #分页显示文件内容
    less 文件名 #与 more 相似,更好的是可以往前翻页
    tail 文件名 #仅查看尾部,还可以指定行数
    head 文件名 #仅查看头部,还可以指定行数
  10. 你平时怎么查看日志的

    Linux查看日志的命令有多种: tail、cat、tac、head、echo等,本文只介绍几种常用的方法。

    • tail(最常使用)

      命令格式: tail[必要参数][选择参数][文件]

      1
      2
      3
      tail -n 10 test.log 查询日志尾部最后10行的日志;
      tail -n +10 test.log 查询10行之后的所有日志;
      tail -fn 10 test.log 循环实时查看最后10行记录(最常用的)

      一般还会配合着grep搜索用,例如 :

      1
      tail -fn 1000 test.log | grep '关键字'

      如果一次性查询的数据量太大,可以进行翻页查看,例如:

      1
      tail -n 4700 aa.log |more -1000 可以进行多屏显示(ctrl + f 或者 空格键可以快捷键)
    • 其它配合的命令

      1
      2
      3
      4
      5
      6
      history              # 所有的历史记录
      history | grep XXX # 历史记录中包含某些指令的记录
      history | more # 分页查看记录
      history -c # 清空所有的历史记录
      !! 重复执行上一个命令
      查询出来记录后选中 : !323
  11. 怎么让进程后台运行

    1. 命令后面加上**&**即可,实际上,这样是将命令放入到一个作业队列中了;

      通常配合nohup ,忽略发送给子命令的挂断SIGHUP信号(终端关闭):

      1
      nohup subcommand &
    2. ctrl + z 挂起进程,使用jobs查看序号,在使用bg %序号后台运行进程;

      ctrl + c 是进程终止。

    3. 运行指令前面**+ setsid**,使其父进程编程init进程,不受SIGHUP信号的影响

2.1.2 其它问题

1.请问/proc 目录有什么用

Linux系统上的/proc目录是一种文件系统,即proc文件系统。 /proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件:

  • 查看系统有关(1)硬件及当前(2)正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。

2. Linux的软/硬链接是什么?有什么区别

参考:“软链接”和“硬链接”的区别

  • 什么是链接

    文件在Linux上被分成两部分:用户数据 (user data) 与元数据 (metadata)

    • 用户数据:即文件数据块,保留记录文件真实内容的地方
    • 元数据: 是文件的附加属性,如创建大小、时间,所有信息等。其中inode号 ,是文件的唯一标识。

    系统通过inode号快速找到文件,有一种方式可以快速寻找到数据元信息,那就是软/硬链接。

    现在我们创建一个新文件myfile

    1
    2
    3
    4
    $ touch myfile && echo "This is a plain text file." > myfile
    $ cat myfile

    This is a plain text file.

    来展示二者区别。

  • 硬链接

    建立 myfile 的一个硬链接 hard ,可以看到二者的inode 是一致的,也就是说指向了同一个物理区块

    硬链接inode :指向文件的地址 & 维护了一个引用计数,只要有文件还指向这个区块,它就不会从硬盘消失。

    1
    2
    3
    4
    5
    $ ln myfile hard  # 建立硬链接hard
    $ ls -li

    25869085 -rw-r--r-- 2 unixzii staff 27 7 8 17:39 hard
    25869085 -rw-r--r-- 2 unixzii staff 27 7 8 17:39 myfile
    • 操作硬链接更新文件,等价更新原文件

      使用hard硬链接修改文件,发现原文件也被修改了。

      1
      2
      3
      4
      5
      $ echo "New line" >> hard
      $ cat myfile

      This is a plain text file.
      New line
    • 删除原文件,使用硬链接依旧可以显示

      因为磁盘块还有硬链接在引用,所以不会消失

      1
      2
      3
      4
      5
      $ rm myfile  # 删除原文件
      $ cat hard # 硬链接依旧可以显示

      This is a plain text file.
      New line
  • 软链接

    建立一个soft软链接如下,可以看到二者的inode号是不一样的。

    软连接的inode :保存真实的文件的绝对路径地址,找到软链接,还要根据inode号找到真实文件路径

    1
    2
    3
    4
    5
    $ ln -s myfile soft # 建立软连接soft
    $ ls -li

    25869085 -rw-r--r-- 2 unixzii staff 27 7 8 17:39 myfile
    25869216 lrwxr-xr-x 1 unixzii staff 6 7 8 17:47 soft -> myfile
    • 操作软链接更新文件,等价更新原文件

      因为软链接就是相当个快捷方式,当然更新原文件。

    • 删除原文件,使用软链接不会显示

      因为软件inode指向的绝对地址,已经不存在文件了,所以当然不存在文件了。

      1
      2
      3
      4
      $ rm myfile
      $ cat soft

      cat: soft: No such file or directory
  • 软硬连接区别总结

    1. inode号不同。硬链接原文件/链接文件公用一个inode号,说明他们是同一个文件,而软链接原文件/链接文件拥有不同的inode号,表明他们是两个不同的文件;

    2. 链接数目不同。 软链接的链接数目不会增加;硬链接每多一个链接就会+1。

    3. 文件大小不同。硬链接文件显示的大小是跟原文件是一样 ;软链接显示的大小与原文件就不同了,BBB大小是95B,而BBBsoft是3B,因为BBB共有3个字符。

    4. 文件系统限制。 软链接没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。

      建立软链接就是建立了一个新文件:当访问链接文件时,系统就会发现他是个链接文件,它读取链接文件找到真正要访问的文件。

3. 查询日志的top10 IP?

命令如下:

1
cat log | cut -d ' ' -f 1 | sort | uniq -c | sort -nr | awk '{print $0}' | head -n 10
  1. cat *.log :将文本内容打印到屏幕

  2. cut:截取指定IP那一列

  3. sort ,按IP ASCII码排序:进行排序,默认是按照ascii码进行排序的

  4. uniq -c ,统计重复的IP :统计相邻的行的重复数量,结果是类似 3 127.13.13.13 ,前面的数字代码重复的行数

    sort|uniq -c 统计重复的行数

  5. sort -n,再次排序 :是按照数值进行由小到大进行排序, -r是表示逆序,-t是指定分割符,-k是执行按照第几列进行排序

  6. awk ,只显示IP:按照分割符将一行分割为多个列,第一列用1表示,第二列用​2表示,依次类推

    awk -F" " '{print $2} ,表示用空格作为分隔符进行分割,打印出第2列

  7. head -n :表示取前n个

2.2 Git

讲git原理的的一篇不错文章

2.2.1 常问命令

1.什么是Git?是用什么语言编写的?

  • Git是一个 分布式 代码控制系统
  • Git使用 C 语言编写:使得 GIT 很快,C 语言减少运行时开销来做到这一点。

2.如何在Git中创建存储库?

  1. 如果项目不存在,创建
  2. 然后运行 git init ,会在目录下创建一个 .git 目录

3.列举工作中常用的几个git命令

  • git add : 增加文件
  • git commit -m :提交文件
  • git status :拉取远程分支
  • git push :合并当前分支和主分支
  • git pull OR git fetch/git merge :拉取远程分支

4.讲讲Git commit 基本参数

参考:https://www.cnblogs.com/qianqiannian/p/6005628.html

  • git commit -m “message” :简要说明这次提交的语句
  • git commit -a :即使没有经过 git add ,也可以将所有 修改删除 的文件提交到本地仓库,但新建的文件不会提交
  • git commit --amend :追加提交,它可以在不增加一个新的commit-id 的情况下将新修改的代码追加到前一次的commit-id中,

5.在Git中,你如何还原已经 push 并公开的提交

  • 删除或修复新提交中的错误文件,并将其覆盖推送到远程存储库:

    1
    git commit -m "commit message"
  • 创建一个新的提交,撤消在错误提交中所做的所有更改:

    1
    git revert <name of bad commit>

6. git pull 和 git fetch 有什么区别

  • git pull

    取回远程主机某个分支的更新,再与本地的指定分支合并 (可能要解决冲突)。

  • git fetch

    从远程获取最新版本到本地,不会自动合并 ,需要手动执行 git merge

7.什么是 git stash?你一般什么情况下会使用它

经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。储藏(stash)可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用

  • 使用情况: 当前分支还没处理完,不能去commit提交,但是要去处理一个紧急开发项目,使用 git stash
  • 处理完后git stash pop 继续处理工作

8.如果本次提交误操作,如何撤销

  • 场景1:改乱了(包括删除等)工作区某个文件的内容(git add 之前):

    1
    git checkout -- <file>

    丢弃之前所有的修改。

  • 场景2:撤销提交到索引区的文件 (git add 之后):

    1
    git reset HEAD <file>

    此时回到了场景1,然后再使用 git checkout

  • 场景3: 撤销已经提交之后的文件(git commit之后):

    回退版本号。

    1
    2
    $ git reflog  # 查看版本
    $ git reset --hard 3928 # 回退版本
  • 场景4: 撤销已经push到远程分支之后的文件(git push之后

    • 创建一个新的提交,撤消在错误提交中所做的所有更改:

      1
      git revert <name of bad commit>
    • 删除或修复新提交中的错误文件,并将其覆盖推送到远程存储库:

      1
      git commit -m "commit message"

9.使用过git merge和git rebase吗?它们之间有什么区别

都是用来合并分支的,但是:

  • git merge <当前分支要合并的分支> : 在当前分支合并<指定要合并的分支>,会自动在当前分支(下图为master)创建一个commit节点,保留了要合并的分支(下图为branch1)的提交记录

    preview

  • git rebase <当前分支变基的基点分支> :相当将当前分支(下图为branch1)的分支节点(5,6) 依次提交到基点分支(master)的4节点之后,保留了更干净的历史记录,没有生成行的commit 节点

    image-20210502231023075