软件安装

  • apt软件源列表在/etc/apt/sources.list

  • 一般情况下, Ubuntu的官方地址为https://archive.ubuntu.com/, 可以替换源

    1
    sudo sed -i 's|//.*archive.ubuntu.com|//mirrors.ustc.edu.cn|g' /etc/apt/sources.list
  • 如果需要一个命令可以在任意地方执行, 可以将这个目录中的内容添加到/usr/local目录下, 即sudo cp -R * /usr/local/

    • 因为usr/local/bin/是在PATH的环境变量下

基本命令

查看文件内容

  • catconcatenate的缩写, 连接多个文件并输出文件内容, 如果只有一个文件, 则直接输出这个文件的内容
  • less一次只显示一页,支持前后滚动搜索的功能
按键 功能
d/u 向下/向上半页
f/b 向下/向上一页
g/G 文件开头/结尾
j/k 向下/向上一行
/PATTERN 搜索PATTERN
n/N 跳转上一个/下一个找到的PATTERN
q 退出

10 j 就是向下移动10行

复制文件目录

  • cp [OPTION] SOURCE... DEST
选项 功能
-r 递归复制, 一般用于复制目录
-f 覆盖DEST位置的同名文件
-u 源文件比目标文件新才进行复制
-l 创建硬链接
-s 创建软链接

创建目录

  • mkdir -p DIR_NAME, 表示如果路径中有中间目录, 则先创建中间目录, 如果要创建的目录已经存在,则不报错

创建文件

  • touch FILE_NAME, 不叫create是因为本质上是修改文件的访问时间修改时间
    • 相当于是摸了一下文件, 使得他的访问时间和修改时间发生改变了, 如果文件不存在,则会创建一个新文件。
    • 如果对已有文件进行touch, 则其Access time, Modify time会发生改变

搜索文件和目录

  • find [OPTION] PATH [EXPRESSION]
选项 功能
-name '*.ext' 文件后缀名为ext的所有文件
-type d 文件类型为目录的文件, f表示普通文件
-size +1M 文件大小大于1M的文件, -表示小于
-or 表示前后两个选项满足一个即可

模式匹配

  • bash的模式匹配称为glob
  • ?表示一个字符, *表示任意字符, *.[ch]表示以.c或者是.h结尾的文件

tar存档压缩

选项 功能
-A 将一个存档文件追加到另一个存档文件
-r 将一些存档文件追加到另一个存档文件
-c 从一些文件创建存档文件
-t 列出一个存档文件内容
-x 从存档文件提取出文件
-f 使用指定的存档文件
-C 指定输出的目录
-z 使用gzip算法处理存档文件
-j 使用bzip2算法处理存档文件
-J 使用xz算法处理存档文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 将f1, f2, f3打包为t.tar
tar -cf t.tar f1 f2 f3
# 将t.tar中的文件提取到t/
tar -xf t.tar -C t/
# 将f1, f2, f3打包并使用gzip压缩,得到t.tar.gz
tar -czf t.tar.gz f1 f2 f3
# 将t.tar.gz 解压缩到t/
tar -xzf t.tar.gz -C t/
# 将a1.tar, a2.tar, a3.tar追加到a.tar中
tar -Af a.tar a1.tar a2.tar a3.tar
# 列出a.tar中的文件内容
tar -tf a.tar
# 打印文件详细信息
tar -tvf a.tar

查看帮助

  • man tar 可以查看tar命令的帮助目录
  • tldr 命令可以直接学习相关命令

进程

htop可以查看进程信息

ps

ps(process status) 进程状态工具

  • 直接使用ps会返回本终端中运行的进程
  • 使用ps aux会显示所有进程

PID进程标识符

  • Linux系统内核从引导程序接手控制权以后, 执行内核初始化, 变为init_stack, 随后创建出1号程序, 一般为init, systemd
  • systemd衍生出用户空间所有进程, 2号进程kthreadd衍生出所有内核线程, 0号进程成为idle进程
  • kthreadd进程在内核空间中, 所以需要shift + K(大写)才能看见, htop中也看不见0号进程, 只能看见1号, 2号进程的PPID为0

优先级

  • htop中有两个值PRI(proiority)NI(nice)
  • nice值是用户层使用的, 越高表示对其他进程越友好, 优先级越低, 通常最高为19, 最低为-20, 一般创建的时候默认为0
  • 可以使用nice命令在创建进程的时候指定优先级, renice可以重新指定
1
2
3
4
# 以10的NI启动vim
nice -n 10 vim
# 将PID=12345的进程NI调整为10
renice -n 10 -p 12345
  • PRI = NI + 20, 普通进程的PRI会被映射到一个非负整数

进程状态

  1. 正在运行: 运行态
  2. 可以运行, 但是还在排队等待: 就绪态
  3. 正在等待其他资源, 无法立即开始执行: 阻塞态
  • htop的状态有R: running, S: sleeping, T: traced/stopped, Z: zombie, D: disk sleep
    • R对应运行态和就绪态
    • S, D对应阻塞态, S表示可以被中断, D表示不可被中断
    • Z是僵尸进程, 上下文结束, 但是仍然占用一个PID, 保存一个返回值
    • T是上下文使用ctrl + Z导致挂起(T), 或者使用gdb这种调试工具跟踪状态时(t)

用户控制进程

进程之间不共享内存, 无法直接发送消息, 所以如果需要控制进程, 就需要操作系统帮忙, 所以产生了信号机制
发送信号的命令就是kill, 因为早期信号的作用就是杀死进程
使用man 7 signal可以查看信号

信号 意义 行为 产生方式
SIGINT (interrupt) 朋友, 别干了 终止进程 ctrl + c
SIGTERM (termiate) 优雅死去 终止进程 kill <PID> or pkill 进程名
SIGKILL (kill) 立即去世 终止进程 kill -9 <PID> or pklii -9 进程名
SIGSEGV (segment violation) 你想知道的太多了 核心转储 什么都不用做, 代码写的烂导致的
SIGSTOP (stop) or SIGTSTP (stop) 让某个进程变成植物人 停止进程 ctrl + z
SIGCONT (continue) 让植物人苏醒 继续进程 fg or bg
  • 如果需要一个进程在后台运行, 不阻止运行时在同一个shell界面操作其他内容, 可以在执行时后面加上&

  • 如果要将一个前台正在执行的程序切换到后台执行, 可以使用ctrl + z挂起进程, 控制权还给shell

    • 接着使用jobs命令查看当前shell下所有挂起的进程, 比如为[2], 可以使用bg %2将进程放到后台执行
  • 如果使用SSH连接终端, 如果终端关闭会断开连接, 这是因为终端关闭以后会向每个进程都发送SIGHUP, 默认动作就是退出程序运行

  • 可以使用nohup, 使程序不被SIGHUP命令影响, nohup ping xxx.xxx.xxx.xxx &

    • 此时输出将会被重定向到nohup.out

tmux

ctrl + b再输入快捷键

快捷键 功能
% 左右分屏
" 上下分屏
方向键 切换分屏选中
d 从命令行脱离, 回到终端界面
z panel暂时全屏, 再按一次恢复原状
c 新建窗口
, 为窗口命名
s 列出所有session
  • 如果掉线了, 会话依然保存在后台, 使用tmux attach [-t 名字]可以恢复

fork

创建进程的基本方法

  • 调用fork的是父进程, 被fork的是子进程
    • 父进程先退出, 子进程就变成孤儿进程, 被操作系统回收, 交给init领养
    • 子进程先退出, 父进程没有回应, 则子进程变成僵尸进程, 释放大部分资源, 占用PID, 大量僵尸进程会导致无法创建新进程

服务

自定义服务

将一个基于Web的应用作为局域网内的服务, 方便其他设备访问, 可以编写.service

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=xxx # 服务简要描述

[Service]
PIDFile=/run/xxx.pid # 用来存放PID文件
ExecStat=/usr/local/bin/xxx --allow-port # 使用绝对路径标明命令以及参数

WorkingDirectory=/root # 服务启动的工作目录
Restart=always # 无论因何原因退出都重启
RestartSec=10 # 退出10s重启

[Install]
WantedBy=multi-user.target # 依赖目标, 指进入多用户模式后再启动该服务
  • 配置好的文件保存为/etc/systemd/system/xxx.service, 运行systemctl daemon-reload, 就可以使用systemctl管理这个服务