0%

2020-07-25-服务器心得

目前使用的是Xshell + winSCP(连接+传输) , MobaXterm也可用于ssh连接的备用软件。

MobaXterm(https://mobaxterm.mobatek.net/):功能很全,免费,有免安装版,支持多标签,同时自带文件传输系统,唯一的不足是对Z-moderm支持较差。

linux后台执行命令:&和nohup

在用本机Xshell连接服务器跑实验时,如果关闭本机电脑,Xshell不再运行时,那么linux终端会话就会关闭,跑的实验就会终止。有时候更希望它能够在每天的非负荷高峰时间段运行(例如凌晨)。为了使这些进程能够在后台运行,也就是说不在终端屏幕上运行,有几种选择方法可供使用。

&使用

在执行文件的时候,可以在命令后面加上&,这样可以实现将进程挂到后台运行。例如: python main.py &

在使用&之后,系统会返回一个进程号PID,需要记下此进程的PID

nohup使用

1
nohup python main.py &

这样执行的时候会将代码放在服务器后台执行,你的终端是看不到运行过程的,期间运行的结果(代码运行过程中打印出来的)会在一个生成的nohup.out文件中保存。

1
2
3
4
nohup python main.py >test.log   2>&1 &
# nohup和& 一起使用。 & 放后台
# >表示将标准输出(STDOUT)重定向到test.log文件
#2>&1 :把标准输出和标准错误一起重定向到一个文件中。1是标准输出的文件描述符,2是标准错误的文件描述符;

可以实现运行main.py ,并将输出结果打印到test.log文件中(如果这个文件不存在, 那就创建, 否则就覆盖)

要想使ssh连接断掉也可以继续后台运行,需要用exit命令断开,否则其它关闭行为视为断开异常(如直接关掉xsheel软件),不会后台运行

nohup与session的关系

如果我们在 session 中执行了 nohup 等类似的命令,当 session 消亡时,相关的进程并不会随着 session 结束,原因是这些进程不再受 SIGHUP 信号的影响。比如我们执行下面的命令:

1
$ nohup sleep 1000 >/dev/null 2>&1 &

img

此时 sleep 进程的 sid 和其它进程是相同的,还可以通过 pstree 命令看到进程间的父子关系:

img

如果我们退出当前 session 的领头进程(bash),sleep 进程并不会退出,这样我们就可以放心的等待该进程运行结果了。 nohup 并不改变进程的 sid,同时也说明在这种情况中,虽然 session 的领头进程退出了,但是 session 依然没有被销毁(至少 sid 还在被引用)。重新建立连接,通过下面的命令查看 sleep 进程的信息,发现进程的 sid 依然是 7837:

img

但是此时的 sleep 已经被系统的 1 号进程 systemd 收养了

img

参考

https://www.cnblogs.com/sparkdev/p/12146305.html

忘记进程

1
2
3
4
5
6
7
ps -ef | grep main.py  #其中main.py是要查找的关键字
ps -ef | grep main.py | grep -v grep #grep -v 排除进程。此时是排除grep自身的进程
ps aux | grep main.py | less
#less进行显示, aux 是显示详细信息
#R: 正在执行中
#S: 静止状态
#T: 暂停执行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
ps命令将某个进程显示出来

grep命令是查找

中间的|是管道命令 是指ps命令与grep同时执行

字段含义如下:
UID PID PPID C STIME TTY TIME CMD

zzw 14124 13991 0 00:38 pts/0 00:00:00 grep --color=auto dae


UID :程序被该 UID 所拥有

PID :就是这个程序的 ID

PPID :则是其上级父程序的ID

C :CPU使用的资源百分比

STIME :系统启动时间

TTY :登入者的终端机位置

TIME :使用掉的CPU时间。

CMD :所下达的是什么指令

这里是两个shell命令通过管道进行了结合,第一个ps能够列出当前系统所有活跃的进程,然后通过grep 关键字查找就能找到带有关键字的进程。找到PID(PID是输出的第二列那个数字)再杀掉。

关闭进程

kill -9 PID . 用普通的ctrl+C是关不掉的

疑问:

在根指令行可以进行nohup,但是我用tmux建立会话之后,在tmux中是不可以运用notop,会弹出 exit 1 的错误指令????

一种方法就是在后台运行之后,再进入tmux操作

htop使用

功能介绍

监视内存,线程,CPU运行状态

htop是Linux系统下一个基本文本模式的、交互式的进程查看器,主要用于控制台或shell中,可以替代top,或者说是top的高级版。

安装htop

Ubuntu sudo apt-get install htop

使用htop

界面概述

安装完成后,命令行中直接敲击 htop 命令,即可进入 htop 的界面

image-20200905224348455

各项从上至下分别说明如下:

img

左边部分从上至下,分别为,cpu、内存、交换分区的使用情况,右边部分为:Tasks 为进程总数,当前运行的进程数、Load average 为系统 1 分钟,5 分钟,10 分钟的平均负载情况、Uptime 为系统运行的时间。

img

以上各项分别为:

  • PID:进程的标识号
  • USER:运行此进程的用户
  • PRI:进程的优先级
  • NI:进程的优先级别值,默认的为 0,可以进行调整
  • VIRT:进程占用的虚拟内存值
  • RES:进程占用的物理内存值
  • SHR:进程占用的共享内存值
  • S:进程的运行状况,R 表示正在运行、S 表示休眠,等待唤醒、Z 表示僵死状态
  • %CPU:该进程占用的CPU使用率
  • %MEM:该进程占用的物理内存和总内存的百分比
  • TIME+:该进程启动后占用的总的 CPU 时间
  • COMMAND:进程启动的启动命令名称

操作说明

htop 界面底部给出了 F1 ~ F10 按键的简单说明。

img

标注进程条目

在系统中运行着的实时进程视图中,要追踪某个进程是个大问题。因为整个列表在不停的刷新着,进程的排列顺序也在变动着。为了这个问题, htop 提供了一个很简单的解决方案:颜色标注。是的,你可以标注一个进程条目,它会以不同的颜色显示,因此要追踪它就变得容易了。

要标注某个进程条目,需要做的就是选中此条目,然后按下空格键。例如,在下面的截图示例中,我已经颜色标注了两个进程条目(黄色高亮显示的两行):

img

命令行选项

除了上面介绍的一些热键,htop 还提供了很有用的命令行选项。下面是其中一部分:

  • -s 选项 : 按指定的列排序。例如,htop -s PID 命令会按 PID 列的大小排序来显示。
  • -u 选项 : 显示指定的用户的进程信息列表。例如,htop -u vagrant 命令会只显示出用户名为 vagrant 的相关进程。
  • -d 选项 : 设置刷新的延迟时间。例如,htop -d 100 命令会使输出在 1 秒后才会刷新(参数 -d 的单位是 10 微秒)。
  • -p 选项:只显示给定的PIDs。例如, htop -p PID
常用命令

shift + m : 按照内存大小排序。 shift + h : 收缩线程。 q : 退出

上下键PgUP,PgDn : 选定想要的进程, 左右键Home,End : 移动字段,当然也可以直接用鼠标选定进程; Space 标记/取消标记一个进程(类似 windows 按着 Ctrl 多选一样 )。命令可以作用于多个进程,例如 "kill",将应用于所有已标记的进程

参考

https://blog.xiewenlong.com/2018/12/htop/

nvidia-smi使用

nvidia-smi 显示出当前GPU的所有基础信息,监控GPU状态和使用情况。命令判断哪几块GPU空闲

image-20200722153957282

解释相关参数含义

GPU:本机中的GPU编号

Name:GPU 类型

Persistence-M:

Fan:风扇转速

Temp:温度,单位摄氏度

Perf:表征性能状态,从P0到P12,P0表示最大性能,P12表示状态最小性能

Pwr:Usage/Cap:能耗表示

Bus-Id:涉及GPU总线的相关信息;

Disp.A:Display Active,表示GPU的显示是否初始化

Memory-Usage:显存使用率

Volatile GPU-Util:浮动的GPU利用率

Uncorr. ECC:关于ECC的东西

Compute M.:计算模式

Processes 显示每块GPU上每个进程所使用的显存情况

Tmux使用

安装tmux -linux

sudo apt-get install tmux

基本概念

tmux采用C/S模型构建,输入tmux命令就相当于开启了一个服务器,此时默认将新建一个会话,然后会话中默认新建一个窗口,窗口中默认新建一个面板。会话、窗口、面板之间的联系如下:

image-20200726233552371

一个tmux session(会话)可以包含多个window(窗口),窗口默认充满会话界面,因此这些窗口中可以运行相关性不大的任务。

一个window又可以包含多个pane(面板),窗口下的面板,都处于同一界面下,这些面板适合运行相关性高的任务,以便同时观察到它们的运行情况。

一般在一个session里进行新建windowspane操作即可

一个session显示如图

img

会话

新建会话
1
2
3
tmux  # 新建一个无名称的会话 

tmux new -s s1 # 新建一个名称为s1的会话
断开当前会话

暂时断开会话,可以进入到原始命令行界面进行操作。也可以Ctrl+B +d进行断开

操作如 tmux new -s demo

1
tmux detach # 断开当前会话,会话在后台运行
进入之前的会话

断开会话后,想要接着上次留下的现场继续工作,就要使用到tmux的attach命令了,语法为tmux attach-session -t session-name,可简写为tmux a -t session-nametmux a。通常我们使用如下两种方式之一即可:

1
2
tmux a # 默认进入第一个会话dd
tmux a -t demo # 进入到名称为demo的会话
关闭会话

会话的使命完成后,一定是要关闭的。我们可以使用tmux的kill命令

1
2
3
4
5
tmux kill-session -t demo # 关闭demo会话 

tmux kill-server # 关闭服务器,即关闭所有会话

tmux kill-session -a -t s1  #关闭除s1外的所有会话
查看所有会话
1
tmux ls # 查看所有会话,显示会话列表
重命名会话S1为S2
1
tmux rename -t s1 s2

Tmux快捷指令

tmux的所有指令,都包含同一个前缀,默认为Ctrl+b,输入完前缀过后,控制台激活,命令按键才能生效。

表一:常用指令

前缀 指令 描述
Ctrl+b s 显示会话列表用于选择并切换 (上下键选择+回车)
Ctrl+b d 断开当前会话
===
Ctrl+b c 新建窗口(windows)
Ctrl+b & 关闭当前窗口(关闭前需输入y or n确认)
Ctrl+b w 打开窗口列表,用于且切换窗口
Ctrl+b , 重命名当前窗口
===
Ctrl+b " 当前面板上下一分为二,下侧新建面板
Ctrl+b % 当前面板左右一分为二,右侧新建面板
Ctrl+b x 关闭当前面板(关闭前需输入y or n确认)
Ctrl+b z 最大化当前面板,再重复一次按键后恢复正常(v1.8版本新增)
Ctrl+b 方向键 移动光标切换面板
Ctrl+b Ctrl+o 顺时针旋转当前窗口中的所有面板
Ctrl+b t 显示时钟

表二:系统指令

前缀 指令 描述
Ctrl+b ? 显示快捷键帮助文档
Ctrl+b d 断开当前会话
Ctrl+b D 选择要断开的会话
Ctrl+b Ctrl+z 挂起当前会话
Ctrl+b r 强制重载当前会话
Ctrl+b s 显示会话列表用于选择并切换
Ctrl+b : 进入命令行模式,此时可直接输入ls等命令
Ctrl+b [ 进入复制模式,按q退出
Ctrl+b ] 粘贴复制模式中复制的文本
Ctrl+b ~ 列出提示信息缓存

表三:窗口(window)指令

前缀 指令 描述
Ctrl+b c 新建窗口
Ctrl+b & 关闭当前窗口(关闭前需输入y or n确认)
Ctrl+b 0~9 切换到指定窗口
Ctrl+b p 切换到上一窗口
Ctrl+b n 切换到下一窗口
Ctrl+b w 打开窗口列表,用于且切换窗口
Ctrl+b , 重命名当前窗口
Ctrl+b . 修改当前窗口编号(适用于窗口重新排序)
Ctrl+b f 快速定位到窗口(输入关键字匹配窗口名称)

表四:面板(pane)指令

前缀 指令 描述
Ctrl+b " 当前面板上下一分为二,下侧新建面板
Ctrl+b % 当前面板左右一分为二,右侧新建面板
Ctrl+b x 关闭当前面板(关闭前需输入y or n确认)
Ctrl+b z 最大化当前面板,再重复一次按键后恢复正常(v1.8版本新增)
Ctrl+b ! 将当前面板移动到新的窗口打开(原窗口中存在两个及以上面板有效)
Ctrl+b ; 切换到最后一次使用的面板
Ctrl+b q 显示面板编号,在编号消失前输入对应的数字可切换到相应的面板
Ctrl+b { 向前置换当前面板
Ctrl+b } 向后置换当前面板
Ctrl+b Ctrl+o 顺时针旋转当前窗口中的所有面板
Ctrl+b 方向键 移动光标切换面板
Ctrl+b o 选择下一面板
Ctrl+b 空格键 在自带的面板布局中循环切换
Ctrl+b Alt+方向键 以5个单元格为单位调整当前面板边缘
Ctrl+b Ctrl+方向键 以1个单元格为单位调整当前面板边缘(Mac下被系统快捷键覆盖)
Ctrl+b t 显示时钟

tmux用于代码后台运行

要想使代码后台运行,我用nohup训练模型时重定向到log文件发现日志显示不全,影响实验结果的呈现,而tmux可以解决这个问题。

在进入tmux,新建一个session的时候,实际上tmux在服务器创建了虚拟终端自己连自己。所以用ctrl+B +D退出tmux,并且断掉ssh连接时后台实验是一直在运行的。下次连接ssh后,再打开tmux的session即可,session不会断掉。并且不需要重定向,结果直接显示在屏幕上。

tmux的个性化设置 -- 待完成

比如通过写脚本,在新建session的时候就自动建多个pane,并运行命令

参考

http://louiszhai.github.io/2017/09/30/tmux/

https://harttle.land/2015/11/06/tmux-startup.html

查看CUDA版本

1
nvcc  --version

zsh

安装

1
sudo apt install git-core zsh

image-20200909193607669

在使用xshell 连接的时候,如果网络断开,那么xshell就会出现中断,出现上面的情况。

屏蔽OMP无用信息

在用tensorflow跑实验的时候,后台会输出OMP的输出,实际上是一些无用信息,如果要系统不显示这些信息,可以如下操作:

image-20201113151911779

1.如果禁用OpenMP警告并将环境变量 KMP_WARNINGS 设置为 off ,这些消息应该消失了或 0 。在运行程序的时候可以选择禁用

1
KMP_WARNINGS = off python train.py

2.或者从Python本身,在初始化OpenMP之前:

1
2
 import os 
os.environ ['KMP_WARNINGS'] ='off'

wget 下载数据集

有时候数据集会很大,在电脑端下载很占用时间而且容易断连,在传输到服务器上也会很慢。使用wget可以实现断点续传直接在linux服务器上下载数据集,比如: 我想下载Wikipedia数据集用于训练我的网络模型,那么:

1
wget -c https://textae.blob.core.windows.net/optimus/data/datasets/wikipedia_json_64_filtered.zip [目标路径]

即可让服务器自己慢慢下载了

具体操作可参考:https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/wget.html

scp传输文件

-------------本文结束感谢阅读-------------
卑微博主,在线求赏