跳转至

Linux 常识

1 linux 快捷操作

  • Ctrl + r:逆向搜索命令历史
  • Ctrl + g:取消搜索
  • Esc:只显示匹配的命令到命令行,但不执行
  • Enter:执行匹配的命令
  • Ctrl + z:挂起命令(通常用于 vim 编辑文件,临时退出编辑)
  • fg:在命令行输入 fg 并执行,将返回被挂起的任务
  • Ctrl + u:删除光标到开头的字符(在命令行下)
  • Ctrl + k:删除光标到末尾的字符(在命令行下)
  • Esc + .:获得上一条命令中的参数,比如上一条命名是 ls /home,获得的参数就是 /home
  • Bang (!) 命令
  • !!:执行上一条命令
  • !blah:执行最近的以 blah 开头的命令,如 !ls
  • !blah:p:仅打印输出,而不执行
  • !$:上一条命令的最后一个参数,与 Alt + . 相同
  • !$:p:打印输出 !$ 的内容
  • !*:上一条命令的所有参数
  • !*:p:打印输出 !* 的内容
  • ^blah:删除上一条命令中的 blah
  • ^blah^foo:将上一条命令中的 blah 替换为 foo
  • ^blah^foo^:将上一条命令中所有的 blah 都替换为 foo
  • cd - :进入到前一个目录(可以在 2 个目录间来回跳转)

2 重要的环境变量

  • HOME: 当前用户主目录
  • PATH: 定义可执行程序或脚本所在路径
  • SHELL: 用户使用的 Shell 解释器名称,如 /bin/bash
  • $PS1 : 命令行提示符

3 设置 locale

使用 locale -a 命令,获取可以使用的 locale。 - 当前命令行生效:在命令行执行 export LANG="zh_CN.utf8"。(注意:其中 zh_CN.utf8 只是其中一种 locale) - 单个用户生效:在用户环境变量配置文件,如 ~/.bash_profile 文件里面写入 export LANG="zh_CN.utf8" - 所有用户生效:在系统环境变量配置文件,如 /etc/profile 文件里面写入 export LANG="zh_CN.utf8"

4 含环境变量 tab 不能补全,生成转义符?

  • 执行 shopt -s direxpand 命令,此命令会直接将环境变量补全路径。
  • 示例
$ export CODE_PATH=/home/shuhw/code
# 输入如下命令后,按下tab
$ cd  $CODE_PATH/
# 上面命令按下tab上直接变成如下命令
$ cd /home/shuhw/code/

5 目录的硬链接数为什么不是 1?

  • 计算公式:$$目录链接总数=1+子目录数$$
title: info 目录的硬链接数为什么不是1?
因为在目录下存在隐藏文件. 和..,.是硬链接指向当前目录,所以当前目录硬链接数变为2;如果含子目录,而父目录因为子目录的..和父目录自己的.,所以父目录硬链接数是3。(使用`ls -l`查看目录硬链接数)

6 ls -l 目录大小

  • https://www.pianshen.com/article/45281509680/
  • https://www.jianshu.com/p/1c22dcb17a2e

7 文件防误删

7.1 方法一: ln 硬链接备份

  • 示例
ln src dest.link 

7.2 方法二: chattr 禁止删除

注意:需要 root 权限 - 示例

chattr +i file

8 僵死进程怎么 kill

  1. 如果父进程号不是 1,直接 kill -9 杀了父进程
  2. 如果父进程号是 1,只能重启机器

9 命令卡住原因排查

  1. 使用 strace 命令跟踪命令执行调用栈,根据输出结果的最后一行分析问题原因。

10 查询 core 文件由哪个程序产生

  • 通过 file 查询
  • 示例
$ file core.657636 
core.657636: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from '/home/here4/.vscode-server/extensions/ms-vscode.cpptools-1.6.0/bin/cpptools'

11 Linux 环境变量

11.1 环境变量文件加载顺序

11.2 PATH

PATH 环境变量冒号 : 作用是作为分割符,如 PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin

注意:但这并不意味着其它环境变量也是以冒号: 来作为分隔符,其它也可以有分号; 等等来作为分隔符,只要使用它的能按规则正确解析即可

11.2.1 关于环境变量的指令

  • env:显示当前系统环境变量
  • export:导入环境变量(临时,只对当前 shell 有效)
  • set:显示 shell 变量
  • unset:清除环境变量

11.2.2 环境变量文件/etc/profile 和~/.profile

  • 系统环境变量文件 /etc/profile
  • 用户环境变量文件 ~/.profile

读取设置环境变量方式: 1. 首先读入的是全局环境变量设定档/etc/profile,然后根据其内容读取额外的设定的文档,如/etc/profile.d 和/etc/inputrc 2. 然后根据不同使用者帐号,去其家目录读取~/.bash_profile,如果这读取不了就读取~/.bash_login,这个也读取不了才会读取~/.profile,这三个文档设定基本上是一样的, 读取有优先关系. 3. 然后在根据用户帐号读取~/.bashrc

11.2.3 系统变量文件/etc/profile

  • /etc/profile 文件中导出了 PATH 变量
$ cat /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "`id -u`" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin"
fi
export PATH

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi
tty | egrep -q tty[1-6] && export LC_ALL=C
  • 但这个文件也可以导出其它变量,如下例导出自定义变量 HELLO
shuhaiwen@shuhaiwen:/etc$ cat /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "`id -u`" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin"
fi
export PATH
export HELLO=hello world

# 省略下面部分
...
  • 要使新增加的变量生效,使用 source 命令
$ source /etc/profile
$ echo $HELLO
hello

11.2.4 用户变量文件~/.profile 与~/.bashrc

~/.profile 可以设定本用户专有的路径,环境变量,等,它只能登入的时候执行一次. ~/.bashrc 也是某用户专有设定文档,可以设定路径,命令别名,每次 shell script 的执行都会使用它一次。

用户变量文件只对当前用户有效,使用和系统变量文件/etc/profile 一样。设置后依然需要用 source 命令进行更新

11.3 export 临时导入环境变量

使用 export 向 PATH 中导入变量 hello

$ export PATH=hello:$PATH
$ echo $PATH
hello:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin

但这只对当前 shell 有效,打开另一个 bash,再次打印 PATH,hello 不存在了

~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin

11.4 LD_LIBRARY_PATH

LD_LIBRARY_PATH 是程序加载动态链接库 (.so) 文件查找的路径。如果你的程序需要加载非默认加载路径的.so 文件时,你必须要将其路径通过 LD_LIBRARY_PATH 导出否则程序会报找不到库错误

12 如何多个进程监控同一个端口号

注意:linux 下是以协议、ip、端口来绑定端口的。 1. 使用不同的网络协议(如 TCP、UDP),则 ip 地址、端口号可以相同 2. 在 Linux Kernel 3.9 版本之后,通过 SO_REUSEPORT 选项,则可以有相同协议、ip、端口号 3. 在多网卡下,不同网卡对应不同的 ip 地址,可以使用不同的 ip 地址绑定相同的端口号

13 磁盘分区和逻辑卷

14 history 历史命令

title: 有的linux环境上只能查询几条历史记录,有的可以查询到上百条,这时为什么呢?
原因是系统设置的HISTFILESIZE、HISTSIZE过小,或者history功能被关闭的原因。
  1. 检查 history 功能是否关闭
## 显示on表示已启动
[root@centos7 ~]# set -o | grep history
history         on
## 如果显示off,编辑/etc/profile,添加如下命令
set -o history
  1. 检查 HISTFILE 、HISTSIZE、HISTFILESIZE 变量值
# 如下检测显示一切正常
[root@centos7 ~]# echo $HISTFILE
/root/.bash_history
[root@centos7 ~]# echo $HISTSIZE
1000
[root@centos7 ~]# echo $HISTFILESIZE
1000
  • 如果 HISTFILE 显示空,则编辑 /etc/profile 文件,在末尾加入 HISTFILE=$HOME/.bash_history
  • 如果 HISTSIZE 过小,则编辑 /etc/profile 文件,在末尾加入 HISTSIZE=1000,数值任意,最大支持 1000,表示缓存命令数量
  • 如果 HISTFILESIZE 过小,则编辑 /etc/profile 文件,在末尾加入 HISTFILESIZE=1000,数值任意,最大支持 1000,表示缓存文件最大支持保存的命令数量
  • 修改后加载环境变量 source ~/.bash_profile

15 系统级知识

15.1 linux 开机引导过程

linux 开机启动,完整的引导和启动过程包含三个主要部分: - 硬件引导:初始化系统硬件 - Linux 引导 (boot):加载 Linux 内核和 systemd - Linux 启动 (startup):systemd 为主机的生产性工作做准备

Linux 启动阶段始于内核加载了 init 或 systemd(取决于具体发行版使用的是旧的方式还是还是新的方式)之后。init 和 systemd 程序启动并管理所有其它进程,它们在各自的系统上都被称为“所有进程之母”。

将硬件引导与 Linux 引导及 Linux 启动区分开,并明确定义它们之间的分界点是很重要的。理解它们的差异以及它们每一个在使 Linux 系统进入生产状态所起的作用,才能够管理这些进程,并更好地确定大部分人所谓的“启动”问题出在哪里。

启动过程按照三步引导流程,使 Linux 计算机进入可进行生产工作的状态。当内核将主机的控制权转移到 systemd 时,启动环节开始。

15.2 namespace 的概念