这些是我在近一年半的学习和服务器维护中常用的命令汇总,包括管理员常用命令和工作常用命令。
管理员常用命令
查看硬件型号或软件版本
代码语言:javascript复制# 查看CPU型号
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
# 查看ubuntu版本
cat /proc/version
uname -a
lsb_release -a
# 查看GPU型号
lspci | grep -i vga
# 输出结果末尾的四位数字,可以去网站:
# http://pci-ids.ucw.cz/mods/PC/10de?action=help?help=pci 查对应的型号,
# 比如1e02是TITAN RTX,2204是3090
# 查看显卡驱动版本
sudo dpkg --list | grep nvidia-*
lspci | grep -i nvidia
# 查看cuda和cudnn版本
cuda版本: cat /usr/local/cuda/version.txt
cudnn: cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
#查看Python解释器
sys.executable
系统语言编码
代码语言:javascript复制# 更改系统语言编码设置:在~/.bashrc中添加
export LC_ALL=C.UTF-8
# 查看系统语言编码当前状态:locale ,查看支持的语言编码:locale -a
设置系统时间和时区
代码语言:javascript复制# 查看当前系统的时间
date -R
# 选择时区
tzselect # 然后将得到的输出添加到 ~/.profile
# 修改日期
sudo date -s 04/09/23
# 修改时间
sudo date -s 11:21:30
# 修改硬件的CMOS时间,这步是为了保证重启后,时区仍然正确
sudo hwclock --systohc
磁盘管理和查看共享内存
代码语言:javascript复制# 统计文件夹内文件数量(包括子文件)
ls -lR | grep "_" | wc -l
# 统计文件夹内文件数量(不包括子文件)
ls -l | grep "_" | wc -l
# 统计文件夹大小
du -h --max-depth=1 ./
# 查找大文件
find / -xdev -size 100M -exec ls -l {} ;
# 查看磁盘分区信息
sudo fdisk -l
# 查看有没有没挂载的硬盘
lsblk
# 查看磁盘大小和挂载情况
df -Th
# 弹出挂载的U盘
gio mount -e /run/media/donhost/不可移动的磁盘 //弹出指定设备(这里-e 选项只能写挂载点)
# 挂载磁盘
mount /dev/sdb1 /mnt/sdb1
# 查看共享内存的大小
df -lh | grep shm
管理用户和用户组
代码语言:javascript复制# 设置root密码
passwd root
# 1、创建新用户
sudo adduser username
# 其中username是你要创建的用户的名字,然后设置密码还有相关信息就可以了
# 2、赋予新用户sudo权限
# 用adduser创建后的新用户是不能使用sudo的,因为还没有赋予相关root权限,执行以下代码赋予权限
# adm是给管理员权限,sudo是给可以使用sudo的权限
sudo usermod -a -G adm [username]
sudo usermod -a -G sudo [username]
# 给所有用户使用docker的权限
sudo usermod -aG docker $USER
# 3、删除用户
# 当需要删除用户时可以使用以下指令
sudo userdel -r username
# 这个指令会删除用户username并把该用户下的所有文件(/home/username/路径下的所有文件)都删除,若要保留这些文件而仅仅删除用户,可使用以下指令
sudo userdel username
# docker新用户赋权限
sudo gpasswd -a <用户名> docker
sudo service docker restart
# 检查特定用户属于哪个组
groups [username]
# 查看所有用户组, 第一个字段是用户组名
sudo cat /etc/group
# 查看所有用户, 开头是用户名
sudo cat /etc/shadow
# 改变文件夹所有者,其中用户组名users不必须
sudo chown -R username:users Document/
更改文件或文件夹权限
代码语言:javascript复制sudo chmod 600 ××× (只有所有者有读和写的权限)
sudo chmod 644 ××× (所有者有读和写的权限,组用户只有读的权限)
sudo chmod 700 ××× (只有所有者有读和写以及执行的权限)
sudo chmod 666 ××× (每个人都有读和写的权限)
sudo chmod 777 ××× (每个人都有读和写以及执行的权限)
其中×××指文件名(也可以是文件夹名,不过要在chmod后加 -R -ld)。
查看ip和6006端口使用情况
代码语言:javascript复制sudo netstat -tunlp |grep 6006
# 杀掉占用端口的进程8790
kill -9 8790
# 查看ip
ifconfig
镜像换源
apt-get 镜像换清华源
- 查看自己Ubuntu的版本:
lsb_release -a
获取版本号后进入https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ - 选取自己版本对应的镜像源,然后进入apt文件夹
cd /etc/apt/
把之前的镜像源复制一份为001:sudo cp sources.list cources.list.001
- 再打开镜像源列表:
sudo vim sources.list
把网站复制的镜像源粘到底下 - 然后更新apt:
sudo apt-get update
sudo apt-get upgrade
pip 换清华源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
conda 换清华源
vim ~/.condarc
修改配置文件
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
然后执行 conda clean -i
清除索引缓存,保证用的是镜像站提供的索引。
(以上做法来源:https://mirror.tuna.tsinghua.edu.cn/help/anaconda/)
指定默认的python
安装新版本的python:
sudo apt install python3.8
查看已有的python版本:
ls /usr/bin/python*
先删除默认的Python软链接:
sudo rm /usr/bin/python
然后创建一个新的软链接指向需要的Python版本:
sudo ln -s /usr/bin/python3.8 /usr/bin/python
运行或监控常用指令
可视化查看CPU和内存使用情况:gnome-system-monitor
# 命令行查看CPU占用情况
sudo apt-get install htop
htop
# 或者直接用top,不需要安装
# 查看内存使用情况
free -m
free -m -s 5 # 每5秒打印一次
# 查看GPU实时情况,每秒更新一次
watch -n 1 nvidia-smi
# 查找文件
sudo find [搜索路径] -name [*文件名*]
如目录下查找文件:find ./ -name "detections.pkl"
# 查看历史指令并过滤
history | grep xxx
工作常用命令
1. 压缩与解压
.zip文件
代码语言:javascript复制# 感觉.zip占用空间比.tar.gz大
unzip FileName.zip # 解压
unzip -d /temp test.zip # 解压到指定目录
unzip -n -d /temp test.zip # 解压时不覆盖已经存在的文件
unzip -o -d /temp test.zip # 解压时覆盖已经存在的文件
zip FileName.zip DirName # 将DirName本身压缩
zip -r FileName.zip DirName # 压缩,递归处理,将指定目录下的所有文件和子目录一并压缩
.gz文件
代码语言:javascript复制# .gz
gunzip FileName.gz # 解压1
gzip -d FileName.gz # 解压2
gzip FileName # 压缩,只能压缩文件
.tar.gz文件、 .tgz文件
代码语言:javascript复制# .tar.gz 和 .tgz
tar -zxvf FileName.tar.gz # 解压
tar -xjvf [NAME].tar.bz2
tar -zcvf FileName.tar.gz DirName # 将DirName和其下所有文件(夹)压缩
tar -C DesDirName -zxvf FileName.tar.gz # 解压到目标路径
sudo tar zcf - airport_data/ | split -d -b 2G - airport_data.tar.gz. # 分卷压缩
2. 软链接
代码语言:javascript复制ln -s [实际存放路径] [链接路径]
# 例如
# ln -s /ssd2/other/kongly01/.vscode-server ~
3. 文件输出重定向
代码语言:javascript复制# 示例
./test.sh > log.txt 2>&1
python mainroute.py 2>&1 >log.txt
上面的调用表明将./test.sh的输出重定向到log.txt文件中,同时将标准错误也重定向到log.txt文件中。 每个程序在运行后,都会至少打开三个文件描述符,分别是0:标准输入;1:标准输出;2:标准错误。 2>&1表明将文件描述2(标准错误输出)的内容重定向到文件描述符1(标准输出),为什么1前面需要&?当没有&时,1会被认为是一个普通的文件,有&表示重定向的目标不是一个文件,而是一个文件描述符。在前面我们知道,test.sh >log.txt又将文件描述符1的内容重定向到了文件log.txt,那么最终标准错误也会重定向到log.txt
4. 后台运行
nohup 命令后加&,如
代码语言:javascript复制nohup python mainroute.py 2>&1 >log.txt &
screen 创建出的screen有两种状态,attached和detached,前者表示用户正在使用,后者表示在后台运行。
代码语言:javascript复制# 创建一个虚拟终端hello
# 如果之前有创建唯一一个同名的screen,则-R会直接进入之前创建的screen
screen -R hello
screen -S hello
# 保持这个screen到后台并回到主终端
# 先按ctrl a,再按d
# 如果意外退出导致screen还处在attached状态,使用下命令变为detached
screen -d hello
# 回到虚拟终端
screen -r hello
# 查看虚拟终端
screen -ls
# 清除虚拟终端
# 进入对应虚拟终端,然后输入:
exit
# screen内中文乱码
# https://cloud.tencent.com/developer/article/1844735
tmux(推荐) https://www.ruanyifeng.com/blog/2019/10/tmux.html
代码语言:javascript复制# 退出用 ctrl d 或者 exit,退出但保存会话用 Ctrl b d 或者 tmux detach
tmux new -s <session-name>
tmux ls
# tmux attach命令用于重新接入某个已存在的会话
tmux attach -t <session-name>
tmux kill-session -t <session-name>
# 切换会话
tmux switch -t <session-name>
# 划分上下两个窗格
tmux split-window
# 划分左右两个窗格
tmux split-window -h
5. 进程管理
代码语言:javascript复制# 查看僵尸进程的状态、父进程、PID、命令
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
6. 其他指令
代码语言:javascript复制# 查看某个路径的文件结构
tree ./xx
# 查看路径下的文件、文件详细信息、所有文件(包括隐藏文件)
ls
ls -l (缩写为ll)
ls -a
# 文件详细信息解释
# -rw-r--r-- 1 kpp staff 5685 9 16 15:43 READ.md
# drwxr-xr-x 3 kpp staff 96 4 18 23:28 week01
# 第一串字符,文件夹为d,接着每三个字符为一组,分别是文件所有者、组用户、其他用户的读、写、执行权限
# 其余是文件拥有者、所在组、文件大小、修改时间
# 进入上个路径
cd -
# 打印当前路径
pwd
# 从本地拷贝文件到远程服务器
scp local_file remote_username@remote_ip:remote_folder
# ssh登录
# 编辑本地的~/.ssh/config 文件,可以给ssh用户名和ip起别名,方便登录,如
Host tencent
HostName xx.xx.xxx.xx(ip)
User root
Port 22
# 生成ssh密钥公钥对 ssh-keygen -t rsa -f yourkeyname -C "备注"
ssh-keygen -t rsa -C "LingyuKong"
# ssh免密登录, 命令将本地的公钥拷贝到远程服务器
# ssh-copy-id [-i [identity_file]] [user@]ip 如
ssh-copy-id root@23.25.345.34
# 显示包括xxx内容的所有文件,只显示文件名
ag xxx
快捷键
在terminal跳转到行首:ctrl a
选定部分区域截图并保存到剪贴板:ctrl shift Prtsc