Linux笔记_0
软件安装
-
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
的环境变量下
- 因为
基本命令
查看文件内容
cat
是concatenate
的缩写, 连接多个文件并输出文件内容, 如果只有一个文件, 则直接输出这个文件的内容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 | 将f1, f2, f3打包为t.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 | 以10的NI启动vim |
PRI = NI + 20
, 普通进程的PRI
会被映射到一个非负整数
进程状态
- 正在运行: 运行态
- 可以运行, 但是还在排队等待: 就绪态
- 正在等待其他资源, 无法立即开始执行: 阻塞态
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 | [Unit] |
- 配置好的文件保存为
/etc/systemd/system/xxx.service
, 运行systemctl daemon-reload
, 就可以使用systemctl
管理这个服务
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Sangs Blog!