0%

Linux小技巧

快捷键

  • 自动补全:Tab
  • 清空屏幕:ctrl + l

系统

  • 关机:shutdown -h now
  • 重启:reboot

CPU相关

总核数 = 物理CPU个数 X 每颗物理CPU的核数

总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

  • 查看物理CPU个数: cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
  • 查看每个物理CPU中core的个数(即核数): cat /proc/cpuinfo| grep "cpu cores"| uniq
  • 查看逻辑CPU的个数: cat /proc/cpuinfo| grep "processor"| wc -l

GPU相关

查看显卡状态

1
nvidia-smi

动态查看显卡状态

添加 watch

1
watch nvidia-smi

gpustat

gpustat

1
gpustat --color -u -c -p -i # 需要 pip install gpustat 或 apt-get install gpustat
  • --color : Force colored output (even when stdout is not a tty)
  • --no-color : Suppress colored output
  • -u, --show-user : Display username of the process owner
  • -c, --show-cmd : Display the process name
  • -f, --show-full-cmd : Display full command and cpu stats of running process
  • -p, --show-pid : Display PID of the process
  • -F, --show-fan : Display GPU fan speed
  • -e, --show-codec : Display encoder and/or decoder utilization
  • -P, --show-power : Display GPU power usage and/or limit (draw or draw,limit)
  • -a, --show-all : Display all gpu properties above
  • --watch, -i, --interval : Run in watch mode (equivalent to watch gpustat) if given. Denotes interval between updates
  • --json : JSON Output

指定程序可见显卡

1
CUDA_VISIBLE_DEVICES=0

更高端一些的:

1
2
nvtop
htop

nvtop

nvtop(NVIDIA TOP)是一个为 NVIDIA GPU 打造的、类 htop 的任务监视器,和 nvidia-smi 功能类似,但有着比 nvidia-smi 更漂亮的外观,也弥补了 nvidia-smi 不能查看一定时间段内 GPU 变化情况的缺陷。

如果是 Ubuntu 19.04,那很简单,一条命令即可:

1
sudo apt install nvtop

如果是 Ubuntu 18.04,则运行下面的命令

新方法:运行 snap install nvtop 即可

注意需要退出 conda 环境,并且会在所在路径生成一个 nvtop 文件夹包含编译的文件

1
2
3
4
5
6
7
8
9
10
11
sudo apt install cmake libncurses5-dev libncursesw5-dev git
git clone https://github.com/Syllo/nvtop.git
mkdir -p nvtop/build && cd nvtop/build
cmake ..

# 如果报错:"Could NOT find NVML (missing: NVML_INCLUDE_DIRS)"
# 那么请使用下面的命令
# cmake .. -DNVML_RETRIEVE_HEADER_ONLINE=True

make
make install # 需要 root 权限,如果报权限错误请加上 sudo

使用方法

输入 nvtop 即可运行

具体参数可以使用 --help 查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ nvtop --help
nvtop version 1.0.0
Available options:
-d --delay : Select the refresh rate (1 == 0.1s)
-v --version : Print the version and exit
-s --gpu-select : Colon separated list of GPU IDs to monitor
-i --gpu-ignore : Colon separated list of GPU IDs to ignore
-p --no-plot : Disable bar plot
-r --reverse-abs : Reverse abscissa: plot the recent data left and older on the right
-C --no-color : No colors
-N --no-cache : Always query the system for user names and command line information
-f --freedom-unit : Use fahrenheit
-E --encode-hide : Set encode/decode auto hide time in seconds (default 30s, negative = always on screen)
-h --help : Print help and exit

参考资料:

清理

有时候将进程 kill 掉但还有残留进程占用者显存不释放,而 nvtopgpustat 都看不到真正的进程号,这个时候:

1
fuser -v /dev/nvidia*

查看所有 GPU 的进程,然后使用 PID 号和 kill 命令清除程序, 也可以查看单独某块 GPU 的进程, 即将上面的命令中的 * 改为 gpu 的 id

1
fuser -v /dev/nvidia0

多个 id 可以用正则匹配

1
fuser -v /dev/nvidia[012]

终端复用

Screen

screen 可以创建一个可离线运行的窗口

新建工作窗口

1
screen -S screen_name

查看所有窗口

1
screen -ls

进入窗口(注意在一个窗口时不要直接进入窗口,否则前一个窗口会一直被占用,需要使用后面的方法强行进入)

1
screen -r screen_name

退出当前窗口

ctrl+A+D.

删除窗口

1
2
screen -X -S screen_name quit
screen kill ID/screen_name

或在窗口内 ctrl+D

把占用者踢掉强行进入

1
screen -d -r screen_name

开启拷贝模式(可以鼠标滚动):ctrl+a+[.


Tmux

  • 启动: tmux
  • 退出: exitctrl+D
  • 前缀键: 先按前缀键 ctrl+b 才能唤起快捷键,注意下面的快捷键都是先按 ctrl+b,放开后再按其他按键(忽略大小写)
  • 帮助(看不懂...): ctrl+b+?, 按 qEsc 退出
  • 会话部分
    • 新建会话: tmux new -s <session name> 编号默认从 0 开始
    • 分离会话: tmux detachctrl+B+D
    • 查看所有会话: tmux lstmux list-session
    • 重新接入会话: tmux a -t <session-id/name>tmux attach -t <session-id/name>
    • 删除会话: tmux kill-session -t <session-id/name>
    • 切换会话: tmux switch -t <session-id/name>
    • 重命名会话: tmux rename-session -t <session-id/name> <new name>ctrl+B+$
    • 查看所有会话and切换: ctrl+B+S
  • 窗口部分(会话session下可以由多个窗口)
    • 新建窗口: tmux new-window -n <window name>ctrl+B+C (默认名称是 bash)
    • 切换窗口: tmux select-window -t <window-id/name>
    • 重命名窗口: tmux rename-window <new name>ctrl+B+,
    • 切换窗口: ctrl+B+window-idctrl+B+w(可以切到其他会话的窗口)
  • 窗格部分(窗口下可以划分多个窗格panes)
    • 划分窗格: (上下) tmux split-windowctrl+B+" (左右) tmux split-window -hctrl+B+%
    • 移动光标: tmux select-pane + (上-U-D-L-R) 或 ctrl+B + (///)
    • 显示窗格编号: ctrl+B+q
    • 移动窗格:
      • 上移: tmux swap-pane -U
      • 下移: tmux swap-pane -D
      • 与上一个交换: ctrl+B+{
      • 与下一个交换: ctrl+B+}
      • 循环前移: ctrl+B+ctrl+o
      • 循环后移: ctrl+B+alt+o
    • 关闭窗格: ctrl+B+x
    • 窗格全屏/恢复: ctrl+B+z
    • 调整大小: ctrl+B+(ctrl/alt)+(///)
    • 将窗格升级成窗口: ctrl+B+!
    • 切换预置布局: ctrl+B+Space
  • 复制模式
    • 进入复制模式: ctrl+B+[
    • 开始拷贝: space(空格键)
    • 结束拷贝: enter(回车键)
    • 黏贴: ctrl+B+]
    • 退出复制模式: qesc
    • 按住 shift 可以使用鼠标复制黏贴
    • 鼠标模式:ctrl+B+: 后输入 set mouse on 关闭的话输入 set mouse off

参考资料


用户相关

创建新用户

1
2
3
4
5
6
7
8
9
10
#创建新用户的步骤
sudo useradd -d /home/user -m user
sudo usermod -s /bin/bash user
sudo passwd user
#设置权限
sudo chmod u+w /etc/sudoers
sudo vi /etc/sudoers
#在root下面添加一行
user ALL=(ALL:ALL) ALL
sudo chmod u-w /etc/sudoers

删除用户

1
sudo userdel -r username

进程相关

  • ctrl+z 挂起进程放入后台
  • jobs 显示暂停的进程
  • fg %n 恢复第 n 个进程在前台运行
  • bg %n 恢复第 n 个进程在后台运行(无法再挂起)
  • fg, bg 不带参数默认恢复最后一个
  • ctrl+c ( kill foreground process ) 发送 SIGINT 信号给前台进程组中的所有进程,强制终止程序的执行
  • ctrl+d ( Terminate input, or exit shell ) 一个特殊的二进制值,表示 EOF,作用相当于在终端中输入exit后回车

查看用户所有进程

1
ps -u User_name

杀进程

1
kill -9 PID

杀死多进程的方法

1
kill $(ps aux | grep "train.py" | grep -v grep | awk '{print $2}')

查看系统信号机制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
kill -l
# 输出为
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
  • 在系统中,(9)SIGKILL和(19)SIGSTOP两种信号,进程是无法捕获的,收到后会立即退出
  • ctrl + C 是发送 (2) SIGINT 信号来终止程序
  • kill 命令默认使用 (15) SIGTERM 信号

文件管理

  • ls(英文全拼:list files): 列出目录及文件名
  • cd(英文全拼:change directory):切换目录
  • pwd(英文全拼:print work directory):显示目前的目录
  • mkdir(英文全拼:make directory):创建一个新的目录
  • rmdir(英文全拼:remove directory):删除一个空的目录
  • cp(英文全拼:copy file): 复制文件或目录,-r 递归
  • rm(英文全拼:remove): 删除文件或目录
  • mv(英文全拼:move file): 移动文件与目录,或修改文件与目录的名称
  • rename: 重命名,支持正则匹配
1
2
3
4
5
6
7
8
9
10
11
sudo 前缀,使用管理者权限
sudo apt-get install/remove application 安装/卸载软件,文件名自动搜索或安装包路径
rm -rf path 不做权限提醒直接删除文件/文件夹
ifconfig -a 显示网卡信息
cp/mv path1 path2 复制/移动文件
sudo reboot 重启
sudo shutdown -h now 立刻关机
sudo shutdown -t time 多久后关机
xrandr --fb 1360x768 修改分辨率
man xrandr 查看文档信息
info xrandr

修改权限

基本的权限标志共 10 位,分别是:

  • 第 1 位标志:标志是文件属性,- 是文件,d 是文件夹
  • 后面 9 为每 3 位一组,分别是文件所有者(Owner)、用户组(Group)、其它用户(Other Users)
  • 每组三位分别表示三种权限:读(read), 写(write), 执行(execute)

修改权限(chmod)

  • 数字表示模式
1
chmod 777 file

即每个数字表示一组权限(二进制表示,7 的二进制为 111 即三种权限都为 1)

  • 符号模式

用 u, g, o, a 分别不是所有者,用户组,其他用户,所有

用 r, w, x 分别表示读写执行权限

使用 +, -, = 对权限进行增加,减少,修改

1
chmod u+x file
  • 递归修改

将对应文件夹及其所有子文件的权限都进行修改加上 -R

1
chmod 777 -R file

符号链接

符号链接类似与 windows 中的快捷方式,创建方法如下:

1
ln -s <path to the file/folder to be linked> <the path of the link to be created>

ln 是链接命令,-s 指定此链接为软链接,-s 也可以写为 -symbolic

ln 命令默认会创建硬链接。path to the file (or folder) 声明了链接目标,即想要为其创建快捷方式的文件或目录。

path to link 即链接(快捷方式)名称。

使用 ls 可以看到符号链接和目标,其第一个字母是 l

确认符号链接:

1
ls -l <path-to-assumed-symlink>

删除符号链接:

1
unlink <path-to-symlink>

或者暴力的 rm 也可以删除,符号链接的本质其实也还是一个文件

压缩和解压

tar打包和解包

tar打包(注:tar 只是将文件进行打包,不压缩,压缩一般使用 gzip 得到 *.tar.gz 文件

1
tar [-op] 源文件

可用参数

  • 打包参数
    • -c: 将多个文件或目录进行打包
    • -A: 追加 tar 文件到归档文件
    • -f 包名: 指定包的文件名。包的扩展名是用来给管理员识别格式的,所以一定要正确指定扩展名
    • -v: 显示打包文件过程
  • 解包参数
    • -x: 对 tar 包做解打包操作
    • -f: 指定要解压的 tar 包的包名
    • -t: 只查看 tar 包中有哪些文件或目录,不对 tar 包做解打包操作
    • -C 目录: 指定解打包位置
    • -v: 显示解打包的具体过程
  • 打包并压缩/解压并解包
    • -z: 自动识别,例如:
      • 打包并压缩:tar -zcvf tmp.tar.gz /tmp/
      • 解压并解包:tar -zxvf tmp.tar.gz

使用参数可以不加 - 例如:tar cvf example.tar example.cfgtar -xvf example.tar.

gzip 压缩和解压

gzip 命令只能用来压缩文件,不能压缩目录,即便指定了目录,也只能压缩目录内的所有文件,所以一般先用 tar 打包再进行压缩,其次,默认会删掉源文件!

1
gzip [-op] 源文件

可用选项

选项 含义
-c 将压缩数据输出到标准输出中,并保留源文件
-d 对压缩文件进行解压缩
-r 递归压缩指定目录下以及子目录下的所有文件
-v 对于每个压缩和解压缩的文件,显示相应的文件名和压缩比
-l 对每一个压缩文件,显示以下字段:压缩文件的大小;未压缩文件的大小;压缩比;未压缩文件的名称
-数字 用于指定压缩等级,-1 压缩等级最低,压缩比最差;-9 压缩比最高。默认压缩比是 -6

zip 压缩和解压

压缩命令

1
zip [-op] 压缩包名 源文件或源目录列表

参数:

选项 含义
-r 递归压缩目录,及将制定目录下的所有文件以及子目录全部压缩
-m 将文件压缩之后,删除原始文件,相当于把文件移到压缩文件中
-v 显示详细的压缩过程信息
-q 在压缩的时候不显示命令的执行过程
-压缩级别 压缩级别是从 1~9 的数字,-1 代表压缩速度更快,-9 代表压缩效果更好
-u 更新压缩文件,即往压缩文件中添加新文件

解压命令:

1
unzip [-op] 压缩包名

参数:

选项 含义
-d 目录名 将压缩文件解压到指定目录下。
-n 解压时并不覆盖已经存在的文件。
-o 解压时覆盖已经存在的文件,并且无需用户确认。
-v 查看压缩文件的详细信息,包括压缩文件中包含的文件大小、文件名以及压缩比等,但并不做解压操作。
-t 测试压缩文件有无损坏,但并不解压。
-x 文件列表 解压文件,但不包含文件列表中指定的文件。

参考资料


文件传输

使用 SCP 命令进行跨服务器文件传输

基本命令:

1
scp [可选参数] file_source file_target 

常用参数:

  • -p: 保留原文件的修改时间,访问时间和访问权限。
  • -P: 端口号
  • -r: 递归复制目录
  • -i: 秘钥文件

示例:

1
2
3
4
5
6
scp local_file remote_username@remote_ip:remote_folder 
scp local_file remote_username@remote_ip:remote_file
scp local_file remote_ip:remote_folder
scp local_file remote_ip:remote_file

> 如果是远程文件复制到本地则将后两个参数互换即可

参考资料:


Vim

Vim

Vim 包括三种模式:命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)

基本用法

  • 命令模式
    • i 切换到输入模式
    • : 切换到底线模式
  • 输入模式
    • esc 切换到命令模式
  • 底线命令模式
    • w 保存文件
    • q 退出 Vim

参考资料


输出问题

常规将控制台输出输出到文件通过重定向即可,如:

1
python test.py > out.txt

注意:> 是覆写模式,>> 是追加模式

script

script 有点类似一个记录器,命令,按键,输出全部可以记录到文件,使用方法为:

1
script -a -f out.txt

就会将shell中的所有内容详细记录到文件中,其中 -a 表示追加模式,-f 表示不缓存实时输出,可以使用 -h 查看更多帮助。最后可以输入

1
exit

就可以终止记录了,显示:Script done, file is out.txt


tee

tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。

1
python test.py | tee -a out.log

常用命令

--- ♥ end ♥ ---

欢迎关注我呀~