0%

Linux知识点笔记

这篇博客主要记录自己在使用Linux服务器时,常使用的一些命令以及需要掌握的知识。其中部分内容参考了一些博主的总结,并附上了参考链接,后续内容会根据自己的学习历程持续更新。

top 命令

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。为了显示详细的进行命令,这里输入:

1
top -c

top-c命令截图

下面进行分析:

第一行 系统信息

显示信息 含义
03:02:19 系统时间
up 175 days,21:01 已运行时间
1 user 当前登录用户,包含系统用户
47.94,36.10,30.82 负载均衡-load average,即1,5,15分钟的负载情况

负载均衡数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

第二行 进程信息

显示信息 含义
Task:794 total 总进程数
6 running 正在运行的进程数
389 sleeping 睡眠的进程数
4 stopped 停止的进程数
109 zombie 僵尸进程数

第三行 CPU使用情况

显示信息 含义
Cpu(s):20.2%us CPU占用率-用户进程占cpu百分比,user space
7.1%sy 系统占用CPU百分比,sysctl
0.0%ni 改变过优先级的进程占CPU百分比
72.6%id 空闲CPU百分比,idolt
0.0%wa IO等待占用CPU百分比,wait
0.0%hi 硬中断占用CPU的百分比,Hardware IRQ
0.0%si 软中断占用CPU的百分比,Software Interrupts
0.0%st 窃取时间,与虚拟化有关,你的虚拟机中系统花了百分之多少等待得到真正的cpu资源,steal time

第四行 内存状态

显示信息 含义
522616916k total 内存总量
380851436k used 内存使用量
141765480k free 内存空闲量
1814552k buffers 缓存的内存量

第五行 swap交换分区信息

显示信息 含义
0k total 交换分区总量
0k used 交换分区使用量
0k free 交换分区空闲量
107261708k cached 缓冲的交换分区总量

备注:

  • 可用内存 = free + buffer + cached

  • 对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。

  • 第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,

  • 第四行中空闲内存总量(free)是内核还未纳入其管控范围的数量。

  • 纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。

第六行 空行

第七行 各进程(任务)的状态监控

显示信息 含义
PID 进程id
USER 进程所有者
PR 进程优先级
NI nice值。越小优先级越高,最小-20,最大20(用户设置最大19)
VIRT 进程使用的虚拟内存总量,单位kb,VIRT=SWAP+RES
RES 进程使用的、未被换出的物理内存大小,单位kb,RES=CODE+DATA
SHR 共享内存大小,单位kb
S 进程状态,D = 不可中断的睡眠状态,R = 运行,S = 睡眠,T = 跟踪/停止,Z = 僵尸进程
%CPU 进程占用CPU百分比
%MEM 进程占用物理内存百分比
TIME+ 进程运行时间
COMMAND 进程命令

备注:

  • PR 越低,优先级越高,PRI(new)=PRI(old)+nice;改变优先级:进入top后按”r”–>输入进程PID–>输入nice值

top后使用的命令

命令 含义
P 以占据CPU百分比排序
M 以占据内存百分比排序
T 以累积占用CPU时间排序
q 退出top查看页面命令
s 修改刷新时间间隔。按下s键,然后按下数字,即可修改刷新时间间隔为你输入的数字,单位为秒。例如:按下s键,在按数字1键,即可实现每秒刷新一次
k 终止指定的进程。按下k键—>再输入要杀死的进程的pid—>按enter键—>(选择信号类型,以数字标示,默认15为杀死)本步可省略按enter键(常用为-9)

参考

孤儿进程和僵尸进程

在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。

  • 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。每当出现 孤儿进程的时候,内核会把孤儿进程的父进程设为init进程(进程号为1),并由init进程对它们完成状态收集工作。因此孤儿进程不会有什么危害。

  • 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,内核释放该子进程所有的资源,而父进程并没有调用wait()或waitpid()获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵尸进程,比如会一直占用进程号等。若一个父进程,定期产生一个子进程,但对子进程退出之后的事一概不问,便产生了大量僵尸进程。我们可以通过kill命令杀死僵尸进程 ,但僵尸进程并非问题根源,罪魁祸首是产生监视进程的父进程,因此我们只需要kill掉那个父进程,僵尸进程便会由init进程接管,init进程会wait()这些孤儿进程,释放它们占用的系统进程表中的资源,进而完成状态收集工作。因此僵尸进程是有危害的。

参考

pip和pip3命令

pip3只有在安装了python3.x之后才会有,比如安装flask库,分情况说明:

  • 此时,若安装了python2.x和python3.x:
    • pip install flask,会安装在目录python2.x/site-packages/下;
    • pip3 install flask,会安装在目录python3.x/site-packages/下;
    • 若使用python3.x执行程序,那么就不能import python2.x/site-packages/来使用python2.x的库。
  • 只安装python2.x:
    • 只能用pip install flask命令安装,会安装在目录python2.x/site-packages/下;
  • 只安装了python3.x:
    • pip install flaskpip3 install flask,都会安装在目录python3.x/site-packages/下;

常用的一些安装命令:

1
2
3
4
5
6
7
# pip 安装超时问题
#1.手动换源(推荐)在 pip 后面跟 -i 来指定源,比如用豆瓣的源来安装 web.py 框架,比如豆瓣和清华的,pip3也可以指定源
pip install numpy -i https://pypi.doubanio.com/simple/
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple/

#2.手动设置延时
pip --default-timeout=100 install numpy

Vim命令

Vim有四种模式:

  • 正常模式:可以使用快捷键命令,或按:输入命令行。
  • 插入模式:可以输入文本,在正常模式下,按i、a、o等都可以进入插入模式。
  • 可视化模式:正常模式下按v可以进入可视模式, 在可视模式下,移动光标可以选择文本。按V进入可视行模式, 总是整行整行的选中。ctrl+v进入可视块模式。
  • 替换模式:正常模式下,按R进入。

查找

正常模式下:

  • /something: 在后面的文本中查找something。
  • ?something: 在前面的文本中查找something。

定位到某一行

正常模式下:

  • 输入:n,定位到第n行。

调到最后一行

  • 跳到文本的最后一行:按“G”,即“shift+g”
  • 跳到最后一行的最后一个字符 :先重复1的操作即按“G”,之后按“$”键,即“shift+4”。
  • 跳到第一行的第一个字符:先按两次“g”,
  • 跳转到当前行的第一个字符:在当前行按“0”。
  • 需要按行快速移动光标时,可以使用键盘上的编辑键Home,快速将光标移动至当前行的行首。除此之外,也可以在命令模式中使用快捷键”^”(即Shift+6)或0(数字0)
  • 如果要快速移动光标至当前行的行尾,可以使用编辑键End。也可以在命令模式中使用快捷键“$”(Shift+4)。与快捷键”^”和0不同,快捷键”$”前可以加上数字表示移动的行数。例如使用”1$”表示当前行的行尾,”2$”表示当前行的下一行的行尾。
  • I是定位到行首,A是定位到行末。

参考

git命令

克隆

1
git clone https://github.com/KunchiLiu/deep_pay

提交

1
2
3
git add .
git commit -m "aa"
git push

本地修改,pull最新

本次修改后无法pull,应先还原,再pull

1
2
git checkout .
git pull

删除已push的文件/文件夹

1
2
3
git rm -r --cached notes.md    
git commit -m "delete notes.md"
git push

强制覆盖

1
2
3
git  fetch -all
git reset --hard origin/master
git pull

版本回退

1
2
git log
git reset --hard 27b845b2d12c4fb8428b84a6a65841a2afe0530a

Mac下github.com无法访问

kill命令

kill所有python进程

  • killall方式

    1
    killall python
  • pkill方式

    1
    sudo pkill python
  • ps方式(脚本)

    1
    ps -ef | grep "python train_mini_batch.py" | grep -v grep | awk '{print $2}' | xargs kill -9
命令 含义
ps -ef 是Red Hat 里查看所有进程的命令。检索结果作为下一条命令的输入。
grep “python train_mini_batch.py” 是所有含有关键字“LOCAL=NO”的进程。
grep -v grep 从列出的进程中去除含有关键字“grep”的进程。
awk ‘{print $2}’ 列出检索出所有的进程号PID。
xargs kill -9 xargs命令是用来把前面命令的输出结果(PID)作为“kill -9”命令的参数,并执行该令。

参考

Shell 脚本

/bin/bash/^M错误

有时候编写脚本时会出现类似标题列出的错误,这个问题大多数是因为你的脚本文件在windows下编辑过。windows下,每一行的结尾是\n\r,而在linux下文件的结尾是\n,那么你在windows下编辑过的文件在linux下打开看的时候每一行的结尾就会多出来一个字符\r,用cat -A file.sh时你可以看到这个\r字符被显示为^M,如下:

1
2
3
4
5
6
7
#!/bin/bash^M$
^M$
echo '1'^M$
#sleep 10&^M$
#echo '3'^M$
#echo '4'^M$
#wait^M$

这时候只需要删除这个字符就可以了,可以使用命令sed -i 's/\r$//' file.sh,删除后如下:

1
2
3
4
5
6
7
#!/bin/bash$
$
echo '1'$
#sleep 10&$
#echo '3'$
#echo '4'$
#wait$

参考

/bin/bash/^M错误