note

0.0. 快捷键

可参考这里。基本已经写到了下面

  1. 输入文件或目录名字的前面的字符,就可以使用tab来自动填充; 当tab后没有自动填充出来,那就是说有多个都是以这开头的,就需要再tab一次,系统就会把以这开头的列出来。

  2. 使用上下键可以快速选择前面使用过的命令,若要退出,就使用ctrl+c。 在服务器使用vim编辑py文件时,缩进一定要用空格来,千万别用tab,看起来是对齐的,但是系统是会报格式错误的,python要得是4个空格的缩进,tab的制表符是不对的(除非去设置)。

  3. ==双击文件名复制,中键粘贴==.

  4. xshell上输入命令后:

    • ctrl+a 快速回到行首,ctrl+e 回到行末; - ctrl+w 可以删除光标前面的一整个单词;
    • ctrl+r 进入搜搜索模式,输入要查找的命令的部分,反复按ctrl+r它会一直向上查找,如果找到自己要的:直接回车是执行、或者按键盘的向右->,它会把命令放界面,然后就可以做修改。(这个还能查找包含有的命令) 同理的还有:比如查找包含 vi 的,先在键盘上输入vi,然后按 PgUp 或 PgDn 向上向下查找。(这个只能查找以 vi 开头的,上面的 nvidia-smi 这种包含的都可以)
    • 注:ubuntu默认没开启PgUp、PgDn的使用,打开方法 sudo vim /etc/inputrc +40 然后去到里面把41行、42行的注释#号去掉,重启终端就可以了。 - ctrl+u 可以删除光标前所有内容,ctrl+k 删除光标后所有内容; ctrl+y 可以把之前删的全部找回来
    • ctrl+l 清屏(同样的还有 clear 命令)

01. cp

cp /home/nianjiuhuiyi/123.txt . #注意后面那个点,这就是把前面那个绝对路径下的文件复制到当前文件夹下

-i:复制的时候,要是有同名文件会给提示,会安全一些 -r:复制目录,cp -r abc test,如果test路径不存在,就相当于把abc全复制过来,然后改名成了test,里面的东西都不会变,如果路径test存在,就是是直接把abc放进test。

02. mv

mv重命令的时候,也加一个 -i 要是有同名文件存在,会提示,这样才不会覆盖,保险一些

参数-u:意思就是update,当把文件从一个目录移动另一个目录时,只是移动不存在的文件,或者文件内容新于目标目录相对应文件的内容。

03. 查看文件内容

3.1. cat

直接显示全部内容:cat 123.txt;一些可加参数:

查看cuda、cudnnn版本

  1. 命令:
  1. 使用pytorch

import torch

print(torch.version.cuda) print(torch.backends.cudnn.version())

查看cpu核心数

.sh脚本中输出一段文字

比如demo.sh就可以在最前面写上:

cat <<EOF

=============================
== Triton Inference Server ==
=============================
NVIDIA Release ${NVIDIA_TRITON_SERVER_VERSION} (build ${NVIDIA_BUILD_ID})
其它的内容,全是提示性的东西。写在最前面,脚本运行的时候就会把这段内容输出出来

EOF

3.2 more

more 123.txt:只显示一屏,通过(enter下一行),也可以(空格,f,来下一页),(b上一页,q退出)

3.3 less

less用于查看比较大的文件:less filename.txt;

04. tree

​ tree直接就会输出当前文件夹下的文件目录结构,也可以tree 其他路径; ​ tree -d就是只到最后一级文件夹。 ​ tree -L 1 /data # 只看一级

05. alias

cd /root/songhui; mkdir abc; cd abc; mv /root/123.txt . linux下是可以把多个命令放在同一行上,命令之间用;隔开,然后执行的,但较长的话,每次都输出就很繁琐,所以:

==alias 给一堆命令起别名== 比如上面那行的几个命令,我想直接完成,可以将那串命令起一个别名,但是这个别名起之前用type 别名,看看系统有没有在使用这个别名,没有的话就是:alisa foo='cd /root/songhui; mkdir abc; cd abc; mv /root/123.txt . ';

​ 那么foo就是别名,在其他地方就能用了,注意后面那串命令整体是用英文的单引号括起来的 ​ 删除别名:unalias foo; ​ 要查看所有定义在系统环境中的别名,使用不带参数的 alias 命令,即直接alias;

Tips:起的别名仅对当前终端有效,退出就没有了,若想一直有效,就可以把这添加到配置文件中去。

06. 查看存储情况

07. ls

搭配通配符查找

​ 搭配通配符ls -l *abc*:这就是列出所有包含abc文件名的文件,*通配任意个(包括0个)任意字符) ​ 列出ls -l a?c.txt:这就是列出名为a c.txt的文件,中间的问号通配==1个任意字符==)

Tips:

08. kill 查看、杀死进程

ps -ef | grep python:就会查找得到所有的python的进程

kill PID:就杀死这个进程,若是杀不掉,就

kill -9 PID:强行杀死这个进程

简单示例一:

kill -9 ps -ef | grep demo/client_cli_ | awk '{print $2}' (这就是杀死所有demo/client_cli_ 的进程)

拆分:

简单示例二:

总结:所以一般是这样的方式来杀死进程:

# ps -aux | grep python | head -n -1 | awk '{print $2}' | xargs kill
ps aux | grep "python client_" | grep -v grep | awk '{print $2}' | xargs kill  # 
# kill `ps aux | grep python | head -n -1 | awk '{print $2}'`
kill `ps aux | grep "python client_" | grep -v grep | awk '{print $2}'`

09. 网络相关

通过ping 127.0.0.1测试本机网卡是否正常。,这也叫本地回环地址

​ ==top== 实时动态显示进程占用信息,这个时候按1可以查看每个逻辑核的使用情况,b可以高亮;若要退出,就q;

​ 端口号查询:netstat -an (端口:0~65535 2的16次方 ,其中知名端口:0~1023)(更多看服务还是用的-nlp)

​ ==临时改变IP地址==(假设原来的地址是192.168.125.125),先找到要修改的网卡名称(假设是ens33):ifconfig ens33 192.125.128那就是把ip地址临时更成了128,重启网卡或是服务器又会还原

10. grep 搜索文本

grep搜索文本中是否包含某指定文本(等同于ctrl+f),, grep nihao 123.txt:就是在123.txt中搜索有nihao的行

好比grep -iv nihao 123.txt;

grep允许对文本进行==模式查找==,又称为正则表达式

Tips:如果是找连续几个单词,且中间有空格,那得是grep "hello python" 123.txt (查找的所有内容必须用引号括起来)

重要:grep -r “hello” /root/dir/ :就是获取指定路径下,凡是含有”hello”的文本

11. 重定向

​ 比如tree或ls -lh > log.txt就是将本应在终端显示的内容写到log.txt中,这个log.txt不一定要存在,后面的文件如果存在,>是要覆盖文件内容的,而>>则是追加到文件最后面。

echo hello python 会在终端显示后面跟的内容,有点print的意思,通常配合重定向使用。 比如 echo hello > a.txt 或echo hello » a.txt
这就是把hello覆盖或追加到a.txt

12. 管道 |

​ 把前面命令的结果,输出给后面的命令再处理后显示出来,通常后面用的更多的是more和grep,比如:

13. scp 文件传输

两台linux之间通过scp来传输文件,主要有两个参数:

简单示例:

  1. 把远程nianjiuhuiyi用户的家目录下的桌面文件里的01.py复制到这台linux的当前位置(-P可不指定): scp -P 22 nianjiuhui@192.168.3.14:Desktop/01.py . # 有时候又要加端口才行
  2. 把当前目录下名为demo的文件夹复制到远程的root目录下: scp -r ./demo/ nianjiuhui@192.168.3.14:/root/

Tips:

14. ssh免密登录

​ linux是自带ssh的,两台linux,或是Mac之间可以直接通过ssh来连接操作,按以下步骤来:

有关SSH配置信息都保存在用户家目录的.ssh目录下。(C:\Users\Administrator/.ssh/id_rsa)

  1. 免密登录

    • 配置公钥:执行ssh-keygen,一路回车即可生成SSH钥匙

    • 上传公钥到服务器:执行ssh-copy-id -p port user@remote,让远程服务器记住公钥(可能不用需要指定端口号,后面需要自己具体user的名字,及remote远程IP地址)

  2. 配置别名

    ssh远程电脑时,即便不输入密码,每次也都要ssh -p port user@remote,比较麻烦,就可以通过==配置别名==来代替这一长串内容,在~/.ssh/config里追加以下内容:

    Host 2080ti HostName 192.168.108.218 User root Port 22 # 这项非必须 IdentityFile “C:\Users\Administrator\.ssh\id_rsa” # 私钥地址(注意双斜杠被转义了一根)

    保存之后就可以使用ssh 2080ti实现远程登录了,且scp同样可以使用。

Tips:

端口转发

​ SSH除了远程登录,还可以转发端口,这样就服务器端就可以不开启服务的端口,直接在win本地开一个ssh端口转发就好了,参考这里

简单在win上使用的命令是:ssh -f -N -L 8001:127.0.0.1:8001 root@192.168.108.218

常用参数

注:除此之外,

15. tar | unzip

15.1. unzip

unzip image.zip -d unzipped_directory

​ 后面的-d参数就是把文件压缩到后面的目录(没有会自动创建)(不指定压缩路径,默认为当前目录下)

unzip -v test.zip | more: 查看压缩文件目录,但不解压。

15.2. tar

​ 其实tar是只打包,是不压缩的,一般来说是先生成.tar文件,再用gzip(或者bzip)来压缩,但是就比较麻烦了,是可以组合在一起使用的。

注:以上针对==.gz是用-zxvf==;如果是==.bz2或者.tbz就用-jxvf==;如果是==.xz就是用-Jxvf==(注意是大写的J)(就是把第一个字母z换掉) 如果没用任何压缩算法,就是.tar包,就不要上面这个参数的第一个字母(代表压缩算法)就好。

以上都是和压缩一起使用,只是单纯打包,不压缩的话:tar -cvf 123.tar ./123/ # v代表显示过程

排除部分文件打包

tar -zcvf 打包后的压缩包名称.tar.gz 文件夹路径&n –exclude=不想打包的文件夹1 –exclude=不想打包的文件 例如: tar -zcvf 20190919-bk-ecstore.tar.gz ./project --exclude=./project/data --exclude=./project/public 注意:要排除一个目录是 –exclude=dir1,而不是 –exclude=dir1/ (是没有那个斜线的)

16. chmod

chmod +/- rwx 文件/目录:增加或减去文件或目录的可读可写可执行文件,若是文件可执行(在ls -l,文件前面有x就是可执行),可以用 ./文件名 来执行。

修改文件权限的命令一般是这三个:

命令 作用
chown 修改拥有者
chgrp 修改组
chmod 修改权限

Tips:

  拥有者         其它  
r w x r w x r w x
4 2 1 4 2 1 4 2 1

对应权限的数字加起来的和就是这个拥有的权限,推荐使用吧。

17. find

​ 平常最直接的用法:find 路径 -name "abc*",这就是查找指定路径中所有以abc开头的==文件==及==文件夹==,(若是不给路径,那就是默认搜索当前目录下)还有一些其他参数: # 因为find是精准查询,当名字不确定时,就可以在文件名前后都加一个*

简单示例:

Tips:

查找文件并删除

方式一:

方式二:

​ rm -rf find /usr/ -name *opencv*:这就是删除所有名字包含opencv的文件 (后面那段表达式是加了一对 ``,这里被格式化了,使用的时候注意要有)。

方式三:

​ find /usr/ -name “gitlab” xargs rm -rf :这就是删除所有找到包含gitlab的文件。 # xargs针对多个命令的单行执行很有用,详情可看这里。(简单来说它就是把前面得到的结果标准化再传递给后面的命令)

总结:整体来看,只是删除文件使用第一种方法还是比较简单;但是涉及到文件夹的删除,那就用第三种方法,第三种方法中的xargs用来几个命令间的链接还是很有用的。

18. ln

18.1. 硬链接

​ 简单来说,硬链接数目,就是能达到文件或目录有多少种方式,也是一种起别名:ln 文件绝对路径 别名;(试了相对路径也行)

​ 再执行ls -l时,显示的数字就是2,然后把原文件删除了,这时ls -l的显示数字就是1了,而且硬链接也不会失效,还是能查看,就相当于是记录的文件存储地址,删除一个快捷方式(原文件名也可以看做是一个快捷方式),还有一个自己创建的硬链接(也相当于是一个快捷方式)。 Tips:

18.2 软链接

ln -s 被链接的源文件(注意使用绝对路径,只是建议,并非强制,临时文件建议用相对路径) 链接文件名称

ln -s /home/songhui/mmdetection/data new_data : 这是目录之间,也可以是文件之间

​ 来解释一下,这就相当于win中的快捷方式,”链接文件名称”就相当于那快捷方式的名称,例如:ln -s /home/Desktop/a/demo/123.txt a_快捷方式, 这就会在当前目录下创建那个绝对路径文件的快捷方式,因为绝对路径,移动也不会有影响。但是原文件要是删除了,软链接就会全部失效

Tips:

==特特特别注意==:

​ 软链接的删除,rm -rf 软链接名称, 重点:使用tab自动补充时,后面会自动跟上 /,这样会删除源文件的,==故一定不能要这个/==,所以最好的办法还是就用粘贴复制,不要使用tab自动补充。

出现更好的方法了,直接使用rm 软连接,这样添加了/后就会说是目录不让删除,就不会误删了。

==软链接与硬链接的区别==: 在linux里,文件内容和文件名称是分开存储的,软链接是文件名的快捷方式,当把文件名删了,软链接也就失效了,文件也就删了找不到了;

​ 但是硬链接是直接指向文件存储的,跟文件名有着一样的功能,把文件名删了,文件还在,还可以通过刚创建的硬链接访问,只有当文件的硬链接为0时,文件就会被删除。

19. watch

watch常用于检测一个命令运行的结果,比如 tail 一个 log 文件,ls 监测某个文件的大小变化,常用的参数就:

简单示例:

也可以watch -n 1 -d tail -f nohup.out_capture_2之类的尝试吧;

说明:后面接的命令若带有管道符,需要加==单引号==将命令区域归整。

20. tail | head

tail命令可用于查看文件的内容,有一个常用的参数-f常用于查阅正在改变的日志文件。

21. 查看文件夹、文件个数

wc命令

Linux wc 命令可以用来对文件进行统计,包括单词个数、行数、字节数

语法:wc [options] [文件名], options有如下:


linux查看文件夹、文件个数:(中间的grep后面跟的正则表达式,^代表开头,wc只是统计)

Tips:可以在ls -l 后跟其它路径。

22. ip相关

dhclient 直接执行就是虚拟机获取一个自动IP地址,没有IP地址的时候执行一下这个命令。

相关具体ip修改可参见这里,在gitlab里面的内容。

23. nohup

先把要执行的命令(如python tools/train.py configs/faster_rcnn/faster_rcnn_r101_fpn_2x_coco.py –gpu-ids 1 )写成一个.sh文件, 再 chmod +x 名称.sh 给这个文件加上执行操作的权限

注:可以用==jobs -l==查看当前终端启动的任务 注:可以通过tail -f nohup.out 来动态查看这个文件的内容的变化

script train.log # 这个可能是xshell终端自带的,也或许其它终端需要手动安装。 这个命令开启后,后面的所有终端输入的命令,以及得到的结果都会被记录在train.log

24. exec

这常用于shell脚本最后,比如启动python训练或是一个web服务之类的。比如“train.sh”

#!/usr/bin/env bash
source /root/anaconda3/bin/activate s_yolov5

exec python train.py --img 1024 --epochs 300 --data coco.yaml --weights ./yolov5m6.pt

执行:./tran.sh

25. ctrl+z后台挂起

linux中巧用ctrl-z后台运行程序,地址。放这吧,我感觉不是很好用。

26. ldd

可以使用ldd后跟程序或动态库名去查看一个程序或是.so动态库用了哪些依赖库,这些库的位置等相关信息,特别是在程序启动失败时,可看是那些库的缺失。

27. systemctl

这个命令是用于将程序注册成服务,以方便程序的开机自启动和意外中途退出后的自启。

无论是ubuntu还是centos,在”/lib/systemd/system/”这个路径下写一个以 .service 结尾的文件。

示例:sdg.service

[Unit]
Description=The AI service of SDG
# 启动顺序
After=basic.target network.target syslog.target
Wants=network.targetd

[Service]
Type=forking

Restart=always
RestartSec=10  # 重启时间
# 下面的运行脚本要给绝对路径,是可以传参数的
ExecStart=/home/sh/project/sdg/run.sh  v01

[Install]
# 被 multi-user.target 依赖
WantedBy=multi-user.target

注意事项:

  1. run.sh中,如果是python启动脚本,run.sh中可以写上类似“source /usr/local/anaconda3/bin/activate base”这样的语句来启动一个虚拟环境,但很大可能程序会启动失败,显示的报错原因是找不到第三方库,可以用journalctl -xeu sdg.service这个命令去查看详细报错原因。 然而直接去运行run.sh脚本时又是ok的,那问题就是使用这种服务启动的方式,对应的python只会去加载类似“/usr/local/anaconda3”这个路径下的路径,而不会去加载用户目录下的第三方库的路径,暂时在脚本中不知道怎么解决。参考的这个教程。 现目前是通过在代码中添加这个路径来实现的:

    import sys
    sys.path.append("/home/dell/.local/lib/python3.11/site-packages")
    
  2. 我常用的run.sh都是启python脚本,像受电弓一个shell脚本中启动多个python进程,以一个服务的方式也是能启动的,但是若是其中某个或几个进程意外挂了,那这个服务是不会去自动重启它的,就达不到要求。 现目前systemctl写服务的方式,还是一个进程对应一个服务来使用。

rsync 待定去写

crontab 定时任务待写;

相关定时任务还可以看看这个airflow项目,然后一些介绍