概述 发展 1991 Linus Linux 0.0.1 版,代码为 8K 行。Linux 加入了 GNU,整体基于 GPL 协议,允许开源、分享传播、修改。 现在使用的 Linux 版本是 Manjaro 20.0.3 (安装版本,滚动更新) 特点 免费、开源 稳定、高效、省资源 安全性:病毒相对较少,不容易更新崩,崩了基本能自救。 多任务多用户多线程 庞大的社区支持、生态环境好 应用方向服务器:主流 嵌入式:稳定、对网络支持性好,低成本、方便修改、对内存和文件管理优越(最小只要 4m 内存) 桌面环境:近年来飞速发展,目前选择 KDE 组成 Kernel:内核:核心程序,管理硬件设备、系统线程进程、内存、交换空间、文件系统、守护进程等。Shell:人机交互界面,连接了用户与 Linux 内核,让用户高效、安全、低成本地使用 Linux 内核。。
如 Bourne shell(sh),Korn shell(ksh)、C shell (csh)、Bourne-again shell(bash)、Z SHell(zsh)、CHange SHell(chsh)、tcsh。常用 bash User Application:用户应用程序:如 Chromium、GIMP 等Files System:文件系统
Linux 文件系统 linux 所有设备都是文件
/:根目录,Linux 有且只有一个根目录,所有东西从这开始,一般只放目录,/home 指的是根目录下的 home 目录。/bin :BINaries,常用二进制可执行命令文件,如 ls、tar、mv、cat 等。/boot:linux 系统启动时引导相关文件,如 Linux 的内核文件:/boot/vmlinuz,系统引导管理器。/dev :DEVices,系统中所有特殊设备文件, 存放 Linux 系统下的设备文件,访问该目录下某个文件,相当于访问设备,常用的是挂载光驱 mount /dev/cdrom/mnt/etc :ETCetera,系统配置文件,如 /etc/inittab、 /etc/fstab、/etc/init.d、 /etc/X11、/etc/sysconfig、/etc/xinetd.d/home:存放普通用户的根目录,如 /home/user_name/root:存放 root 用户的相关文件,系统管理员 root 的家目录/lib :LIBraries,库文件,存放不能直接运行的,却是许多程序运行所必需的一些函数库文件。/mnt:MouNT,临时挂载其他的文件系统,如光驱、软驱/media :挂载本地磁盘或其他存储设备/opt:OPTion,第三方软件放置目录/proc:PROCesses,虚拟的目录,是系统内存的映射,可直接访问这个目录来获取系统信息。/sbin:Super BINaries, Superuser BINaries,存放具有一定权限(root)才可以使用的命令。如 fdisk、shutdown、mount 等。一般用户只能查看,不能使用/srv | SeRVices | 网络服务进程所需的数据文件。常见的服务例如 WWW,FTP 等。/sys | SYStem | 虚拟文件系统,主要记录与内核相关的信息,包括目前已加载的内核模块与内核检测到的硬件设备信息,同样不占硬盘容量/tmp:一般用户或正在执行的程序临时文件存放目录,任何人都可以访问,重要数据不可放置在此目录下/usr| Unix System/Software/Shared Resources | 系统应用程序和相关文件,“Unix 操作系统软件资源” 所放置的目录,不是用户数据。 FHS 建议所有的软件开发者应该将他们的数据合理的放置到这个目录下的子目录,而不是自行新建该软件自己独立的目录。用户工具与应用程序/usr/bin :存放应用程序/usr/share :存放共享数据/usr/lib :系统使用的函数库目录,/usr/local:存放软件升级包。/usr/share/doc:系统说明文件存放目录。/usr/share/man:程序说明文件存放目录/etc/fstab | FileSystem TABle | 文件/etc/fstab 包含了静态文件系统信息,定义了存储设备和分区整合到整个系统的方式。mount 命令会读取这个文件,确定设备和分区的挂载选项。/tmp | TeMPorary | 公用的临时文件存储点/var | VARiable | 存放经常变化的文件。比方说各种服务的日志文件 account/cache/lib/log/tmp/mail/spool/var/log/message:所有的登录文件存放目录/var/spool/mail:邮件存放的目录/var/run 程序或服务启动后,其 PID 存放在该目录下/lost+found:系统异常产生错误时,会将一些遗失的片段放置在此目录下万物皆文件 文件类别 文件属性 蓝色:目录文件 绿色:可执行文件:内置命令、内建于 shell 的命令(如 cd)、用户程序、shell 脚本等 蓝色:链接文件:link 红色:压缩文件:tar、zip 等 灰色:其他文件 路径 目录路径不带尾斜杠:指整个目录,包括目录本身 带尾斜杠:指目录中的文件,不包括目录本身 文件路径不用带尾斜杠 绝对路径:以 / 开头的,从根目录去描述该文件或文件夹的路径。 相对路径:从当前目录去描述某文件或文件夹下的路径。.:表示当前目录,pwd..:表示上一级目录,即父目录根目录下的 . 和 .. 都表示当前目录 安装软件 apt:Advanced Packaging Tool
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 28 29 30 31 32 33 34 # debian debian # ubuntu apt/apt-get # redhat-centos yum install python # .deb gdebi # .rpm, RPM Package Manager fedora wget https://….rpm rpm -i helloworld.rpm rpm -i xx.rpm # 安装 rpm -ivh name.rpm rpm -e pkg1 # 删除 rpm -U file1.rpm # 升级 rpm -q # 查询 rpm -V # 校验已安装的软件包 rpm -K # 校验软件包中的文件 # tar.gz tar -vxf helloworld.tar.gz ./configure make make install # 查看安装了哪些软件 dpkg -l apt list --installed | grep xx
命令常识 大小写敏感 :Linux 中文件名与命令名是大小写敏感的,File1 与 file1 是两个不同的文件名隐藏文件 :. 开头的文件是隐藏文件,一般作为一些配置使用,ls 不能列出,需要 ls -a文件扩展名 :Linux 没有文件扩展名的概念,但应用程序有,所以才有对应的扩展名。文件名 :Linux 支持长文件名,可包括空格、格点符号,但:请不要在文件名中使用空格,标点符号只使用 .、_、-console:控制台,硬件,早期的对电脑进行操作的计算机部件,一个电脑只有一个 console tty(teletypewriter):硬件,输入的,电传打字机 terminal:终端,硬件,早期物理终端,多个用户操作同一电脑 shell:软件程序,操作系统的操作界面 Command Line:命令行: 基本命令 1 2 3 4 5 6 增: touch、mkdir 删: rm、rmdir 改: cd、mv、cp、vi 看: ls、stat、du、tail 查: find、grep、which、whereis 打包: tar、zip、unzip
1 2 3 4 5 看: id 改: su、sudo、passwd 用户: useradd、userdel、usermod 组: groupadd、groupdel、groupmod 文件: chmod、chown、chgrp
1 2 3 4 5 服务: systemctl 性能监控: top、free、nvidia-simi、iostat 磁盘: du、df、lsblk、mount、umount 网络: ping、ssh、scp、wget、netstat 进程: ps、kill、nohup
终端快捷键 Tab:自动补全Ctrl+a:移动光标到行首,即 HomeCtrl+e:移动光标到行尾,即 EndALT + F:跳向下一个空格ALT + B:跳回上一个空格Ctrl+u:剪切光标到行首的所有内容Ctrl+k:剪切光标到行尾的所有内容Ctrl+&:恢复上面删除的单词Ctrl+y:将剪切的文本粘贴到光标位置Shift + Insert:向终端内粘贴文本Ctrl+s 暂停当前程序,暂停后按下任意键恢复运行Ctrl+q 继续屏幕输出Ctrl+z 将当前程序放到后台运行,恢复到前台为命令 fgCtrl+l:清屏,即 clear 命令Shift+PgUp:将终端显示向上滚动,类 pgupShift+PgDn:将终端显示向下滚动,类 pgdnCtrl+r:搜索命令历史 Ctrl+p:历史中的上一条命令,即 upCtrl+n:历史中的下一条命令,即 downCtrl+d:关闭,exitCtrl+c:终止进程/命令CTRL+F:forward one window:向前CTRL+B: backward one window:向后滚屏CTRL + SHIFT + V: 粘贴(Linux 中不需要复制的动作,文本被选择就自动被复制)技巧 文本编辑器:vi/vim 必备
tab 补全:补全命令、补全目录、补全命令参数
date:显示或设置系统时间与日期
cal:日历 calendar
history:终端执行过的所有命令,history 5:最近使用的 5 个命令
Shell 通配符
; 同一行的分隔符* 匹配 0 或多个字符,常用来匹配多个文件? 匹配任意一个字符文件名通配符(单个文件)[list]:匹配 list 中的任意单一字符[!list]: 匹配 除 list 中的任意单一字符以外的字符[c1-c2]: 匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z]{string1,string2,...}:匹配 string1 或 string2 (或更多) 其一字符串{c1..c2}: 匹配 c1-c2 中全部字符 如{1..10}
alias alias:设置命令的别名
1 2 alias update='sudo pacman -Syyu' alias py = 'python'
xdg-open xdg-open:默认方式打开文件
watch watch:每 2 秒重复执行命令
1 2 3 4 # 实时查看 watch -n 0.5 -d nvidia-smi -n # 时间间隔,单位为 s -d # 高亮显示差异部分
常用 1 2 3 4 5 6 7 8 9 10 11 12 # 查看目录下最大的十个文件 du -h|sort -h -r|head -n 10 # xargs使管道输入的每一行,都执行xargs 参数的命令 # 统计代码行数 find . -name "*.cpp" -o -name "*.h" |xargs wc -l # 查找一天内改动过的文件(加 -delete 可删除) find ./ -mtime -1 -type f # 命令行快速查找代码 grep -G "xxx" # 快速终止进程 ps -a | grep chrome |xargs kill -9
批处理 ; 从左到右依次执行命令(前后无逻辑关系,不管是否正确,都会一个个执行)&&:从左到右依次执行命令,中间有一个失败则停止(顺序执行)||:前面的执行成功,后面的不会执行,前面的执行失败,后面的会执行(二选一)1 command1 && command2 && command3 || command_final;
|:管道| :管道输出,把上一个命令的结果交给|的后面的命令处理
管道:利用缓冲传输介质内存或文件连接两个进程;按字符流读写,先进先出,解决互斥同步 1 2 ls | grep aa ls /bin /usr/bin | sort |uniq |less
& 后台执行 &:在后台执行【&&】前面的执行成功,才会执行后面的,前面的执行不成功,后面的不会执行 1 2 # 前面在后台跑,然后执行后面的程序 pwd & cat index.html
I/O 重定向 后台程序使用 nohup 时, 会默认将输出写入 nohup.out 文件,输出较多时 nohup.out 会不断的增大,此时需对输出进行重定向 1 2 3 4 5 6 7 8 9 10 11 ls -l /usr/bin > ls-output.txt # > 重定向标准输出到文件,覆盖原文件 ls -l /usr/bin >> ls-output.txt # >> 重定向标准输出到文件,追加到原文件后 ls -l /usr/none 2> ls-error.txt # 2> 重定向标准错误 < # 重定向输入 ls >/dev/null 2>&1 # 只输出错误信息 nohup ./program >/dev/null 2> {log_file_path} & # 连错误信息也不需要 nohup ./program >/dev/null 2>&1 &
web 服务器 1 2 # 将当前目录下的所有文件以端口号 7777 暴露给所处网络的所有用户 python -m http.server 7777
帮助信息 -whereis/whatis/man/help whereis:查看命令的执行路径whatis:whatis command:查看命令的简要说明info:info command:查看命令的详细描述which:查看命令的可执行程序位置man:manual:显示命令手册页,对用户命令、系统调用、c 库函数、设备与网络接口、文件格式、游戏与屏保、环境/表/宏、系统管理员命令和后台运行命令的帮助。具体参数与使用方法help:获取帮助,查看命令的用法和相关参数。type:显示命令的类别,说明怎样解释一个命令行。apropos:显示一系列适合的命令。
which/where which:在 PATH 变量指定的路径中,搜索某个命令的位置,并返回第一个搜索结果
1 2 3 4 -n 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名 -p 与-n 参数相同,但此处的包括了文件的路径 -w 指定输出时栏位的宽度 -V 显示版本信息
whereis:whereis 命令是定位可执行文件、源代码文件、帮助文件在文件系统中的位置。
1 2 3 4 5 6 7 -b 定位可执行文件 -m 定位帮助文件 -s 定位源代码文件 -u 搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件 -B 指定搜索可执行文件的路径 -M 指定搜索帮助文件的路径 -S 指定搜索源代码文件的路径
维护 debian 系的所有操作记录在 /var/log/auth.log参考资料 文件与目录管理 增 touch touch:创建文件或更改文件的时间,更新时间戳:文件的访问和修改时间改为当前时间。(建立空文件夹)
1 2 3 4 5 6 -a 或--time =atime 或--time =access 或--time =use 只更改存取时间 -c 或--no-create 不建立任何文档 -d 使用指定的日期时间,而非现在的时间 -f 此参数将忽略不予处理,仅负责解决 BSD 版本 touch 指令的兼容性问题 -m 或--time =mtime 或--time =modify 只更改变动时间 -r 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同 -t 使用指定的日期时间,而非现在的时间
mkdir mkdir:make directories:创建目录
1 2 3 4 mkdir -p aa/bb/ccmkdir -m 777 dd
删 rm rm :remove:删除文件或目录
1 2 3 4 5 rm -r dir1 rm -f aa rm -i *.txt rm *.log rm -rf dir1
rmdir rmdir :remove empty directory:删除空目录
改 cd cd:Change Directory, 切换工作目录,cd mydir
1 2 3 cd - # 返回进入此目录之前所在的目录 cd .. # 返回上级目录 cd ~ # 返回当前用户主目录
mv/cp/rename mv:move:移动或重命名现有的文件或目录。
1 2 3 4 5 -b :若需覆盖文件,则覆盖前先行备份 -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖 -i :若目标文件 (destination) 已经存在时,就会询问是否覆盖 -u :若目标文件已经存在,且 source 比较新,才会更新(update) -t : --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY,即指定 mv 的目标目录,该选项适用于移动多个源文件到一个目录的情况,此时目标目录在前,源文件在后
cp:copy:复制文件或目录,并保持文件的权限、属主和时间戳
1 2 3 4 5 6 7 8 9 10 -t --target-directory 指定目标目录 -n --no-clobber 不要覆盖已存在的文件(使前面的 -i 选项失效) -f --force 强行复制文件或目录,不论目的文件或目录是否已经存在 -u --update 使用这项参数之后,只会在 cp -a tool /home/vpser/www /*把 tool 目录,复制到 www 目录下 */cp -r sourceFolder newFolder cp -p cp -i cp -u
rename:rename:文件批量改名,
1 2 rename .rm .remb *把所有文件的后辍由 rm 改为 rmvb renam "re/A-Z/a-z/" *把所有文件名中的大写改为小写
ln ln:link:创建硬链接或符号链接
1 2 3 4 5 6 7 8 9 10 11 -b 删除,覆盖以前建立的链接 -d 允许超级用户制作目录的硬链接 -f 强制执行 -i 交互模式,文件存在则提示用户是否覆盖 -n 把符号链接视为一般目录 -s 软链接(符号链接) -v 显示详细的处理过程 选择参数: -S “-S<字尾备份字符串> ”或 “--suffix=<字尾备份字符串>” -V “-V<备份方式>”或“--version-control=<备份方式>”
sort sort:
1 2 3 sort name.txt sort -r name.txt #降序 sort -t: -k 3n /etc/passwd |more # 以第三个字段对/etc/passwd 的内容排序
vi/vim vi:visual improved:文本编辑
1 2 3 4 vim +10 aa.txt # 打开文件并跳到第 10 行 vim +/hello aa.txt # 打开文件跳到第一个匹配的行 vim -R aa.txt # 只读方式打开 :w !sudo tee %
rsync rsync:remote sync:远程同步,linux 下的数据镜像备份工具,增量传输 数据
特点:会检查发送发和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动) 功能 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 # 常用 rsync -avz --delete -e 'ssh -p 28949' --chown=0:0 /cygdrive/d/workspace/rsync_test root@47.89.xxx.xxx:/root # -e: 指定ssh的端口 rsync -avz -e 'ssh -p 28949' root@47.89.xxx.xxx:/root/rsync_test /cygdrive/d/workspace rsync -avzP --chown=0:0 --chmod=644 /cygdrive/d/workspace/test root@192.168.xx.xx::test # 还有一种更先进的chmod 方式,可以指定到具体的文件夹和文件 --chmod=Dg+s,ug+w,Fo-w,+X --chmod=D2775,F664 # D代表目录,F代表文件,ugo,应该代表user、group、other rsync -avzP --chown=0:0 --chmod=644 --exclude='Suite' /cygdrive/d/workspace/test root@192.168.xx.xxx::test rsync -a source [destination] # 可递归同步 + 同步元信息 rsync -r source [destination] # 将源目录同步到目标目录 rsync -r source1 source2 destination # 多个目录同步到目标目录 rsync /etc/fstab /tmp # 在本地同步 rsync -r /etc 172.16.10.5:/tmp # 将本地/etc 目录拷贝到远程主机的/tmp 下,以保证远程/tmp 目录和本地/etc 保持同步 rsync -r 172.16.10.5:/etc /tmp # 将远程主机的/etc 目录拷贝到本地/tmp 下,以保证本地/tmp 目录和远程/etc 保持同步 rsync /etc/ # 列出本地/etc/目录下的文件列表 rsync 172.16.10.5:/tmp/ # 列出远程主机上/tmp/目录下的文件列表 rsync -avz --delete source/ destination rsync -avu --delete /home/user/A/* /home/user/B/ # -v: 显示 rsync 的详细过程,-vvv 时会有更详细的信息 # 加了--delete 才会保证是镜像副本,否则 rsync 只确保源目录的所有内容都复制到目标目录, rsync -av --exclude='*.txt' source/ destination # 排除一些文件 rsync -av --exclude='dir1/*' source/ destination rsync -av --exclude={'dir1/*','test.txt'} source/ destination rsync -av --exclude={'dir_root_name/dir1/*','dir_root_name/dir2/*'} ./dir_root_name user@ip:/home/user/project_dir # dir_root_name在project_dir下 rsync -anv source/ destination -a:递归同步 + 同步元信息 -n:模拟执行,并不是真正执行 -v:将结果输出到终端 -a、--archive 参数表示存档模式,保存所有的元数据,比如修改时间(modification time)、权限、所有者等,并且软链接也会同步过去。 --append 参数指定文件接着上次中断的地方,继续传输。 --append-verify 参数跟--append 参数类似,但会对传输完成后的文件进行一次校验。如果校验失败,将重新发送整个文件。 -b、--backup 参数指定在删除或更新目标目录已经存在的文件时,将该文件更名后进行备份,默认行为是删除。更名规则是添加由--suffix 参数指定的文件后缀名,默认是~。 --backup-dir 参数指定文件备份时存放的目录,比如--backup-dir=/path/to/backups。 --bwlimit 参数指定带宽限制,默认单位是 KB/s,比如--bwlimit=100。 -c、--checksum 参数改变 rsync 的校验方式。默认情况下,rsync 只检查文件的大小和最后修改日期是否发生变化,如果发生变化,就重新传输;使用这个参数以后,则通过判断文件内容的校验和,决定是否重新传输。 --delete 参数删除只存在于目标目录、不存在于源目标的文件,即保证目标目录是源目标的镜像。 -e 参数指定使用 SSH 协议传输数据。 --exclude 参数指定排除不进行同步的文件或文件夹,支持通配符,比如--exclude="*.iso", --exclude "output" --exclude-from 参数指定一个本地文件,里面是需要排除的文件模式,每个模式一行。 --existing、--ignore-non-existing 参数表示不同步目标目录中不存在的文件和目录。 -h 参数表示以人类可读的格式输出。 -h、--help 参数返回帮助信息。 -i 参数表示输出源目录与目标目录之间文件差异的详细情况。 --ignore-existing 参数表示只要该文件在目标目录中已经存在,就跳过去,不再同步这些文件。 --include 参数指定同步时要包括的文件,一般与--exclude 结合使用。 --link-dest 参数指定增量备份的基准目录。 -m 参数指定不同步空目录。 --max-size 参数设置传输的最大文件的大小限制,比如不超过 200KB(--max-size='200k')。 --min-size 参数设置传输的最小文件的大小限制,比如不小于 10KB(--min-size=10k)。 -n 参数或--dry-run 参数模拟将要执行的操作,而并不真的执行。配合-v 参数使用,可以看到哪些内容会被同步过去。 -P 参数是--progress 和--partial 这两个参数的结合。 --partial 参数允许恢复中断的传输。不使用该参数时,rsync 会删除传输到一半被打断的文件;使用该参数后,传输到一半的文件也会同步到目标目录,下次同步时再恢复中断的传输。一般需要与--append 或--append-verify 配合使用。 --partial-dir 参数指定将传输到一半的文件保存到一个临时目录,比如--partial-dir=.rsync-partial。一般需要与--append 或--append-verify 配合使用。 --progress 参数表示显示进展。 -r 参数表示递归,即包含子目录。 --remove-source-files 参数表示传输成功后,删除发送方的文件。 --size-only 参数表示只同步大小有变化的文件,不考虑文件修改时间的差异。 --suffix 参数指定文件名备份时,对文件名添加的后缀,默认是~。 -u、--update 参数表示同步时跳过目标目录中修改时间更新的文件,即不同步这些有更新的时间戳的文件。 -v 参数表示输出细节。-vv 表示输出更详细的信息,-vvv 表示输出最详细的信息。 --version 参数返回 rsync 的版本。 -z 参数指定同步时压缩数据。
参数
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 28 29 30 31 32 最常用的选项组合是"avz",即压缩和显示部分信息,并以归档模式传输 -v:显示 rsync 过程中详细信息。可以使用"-vvvv"获取更详细信息。 -P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度信息的)。 -n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看 rsync 是如何工作的。 -a --archive :归档模式,比-r 更强,除了会递归同步外,还会同步元信息(如修改时间、权限等)等同于"-rtopgDl"。 -r --recursive:递归到目录中去。 -t --times:保持 mtime 属性。强烈建议任何时候都加上"-t",否则目标文件 mtime 会设置为系统时间,导致下次更新 :检查出 mtime 不同从而导致增量传输无效。 -o --owner:保持 owner 属性(属主)。 -g --group:保持 group 属性(属组)。 -p --perms:保持 perms 属性(权限,不包括特殊权限)。 -D :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。 -l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。 -z :传输时进行压缩提高效率。 -R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。用法见下文示例。 --size-only :默认算法是检查文件大小和 mtime 不同的文件,使用此选项将只检查文件大小。 -u --update :仅在源 mtime 比目标已存在文件的 mtime 新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。 -d --dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝 dir1 目录,使用该选项将拷贝 dir1 但不拷贝 file1。 --max-size :限制 rsync 传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"--max-size=1.5m") --min-size :限制 rsync 传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。 --exclude :指定排除规则来排除不需要传输的文件。 --delete :以 SRC 为主,对 DEST 进行同步。多则删之,少则补之。注意"--delete"是在接收端执行的,所以它是在 :exclude/include 规则生效之后才执行的。 -b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。 --backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。 -e :指定所要使用的远程 shell 程序,默认为 ssh。 --port :连接 daemon 时使用的端口号,默认为 873 端口。 --password-file:daemon 模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程 shell 认证的密码,而是 rsync 模块认证的密码。 -W --whole-file:rsync 将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。 --existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。 --ignore-existing:要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能,见下文示例。 --remove-source-files:要求删除源端已经成功传输的文件。
看 ls ls:List Directory Contents:列出目录下的内容
1 2 3 4 5 6 7 8 9 10 11 12 ls -lh-a 所有,包括.开头的隐藏文件 -t 时间排序 -d 仅列出目录 -l 详细信息,列出文件夹的内容,一行一个文件 -R 递归列出所有文件,(内容较多) ls -lihinode 文件种类和权限 硬链接个数 属主 所归属的组 文件或目录大小 最后访问或修改时间 名称 2095119 -rw-r--r-- 1 root root 0 11-16 14:43 test.log
tree tree:以树状格式显示文件目录
lsof lsof:list open files:查看文件。
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 28 29 -a 列出打开文件存在的进程 -c<进程名> 列出指定进程所打开的文件 -g 列出 GID 号进程详情 -d<文件号> 列出占用该文件号的进程 +d<目录> 列出目录下被打开的文件 +D<目录> 递归列出目录下被打开的文件 -n<目录> 列出使用 NFS 的文件 -i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip ) -p<进程号> 列出指定进程号所打开的文件 -u 列出 UID 号进程详情 -h 显示帮助信息 -v 显示版本信息 # 列出谁在使用某个文件 lsof {file_path} # 列出谁在使用某个端口 lsof -i :8090 # 列出某个用户打开的文件信息 lsof -u username # 列出某个程序进程所打开的文件信息 lsof -c mysql # 通过某个进程号显示该进程打开的文件 lsof -p 123123 # 网络连接 lsof -i # tcp 连接 lsof -i cp # 列出某个用户的所有活跃的网络端口 lsof -a -u test -i
file/stat file:查看文件类型或文件属性信息
cat/more/less cat:catenate:查看文件,连接两个或者更多文本文件或以标准输出形式打印文件内容
more:按页显示文件内容
less:按页显示文件内容,允许在文件中滚动浏览并检索信息,不加载整个文件件的前提下显示文件内容,常用来看大型日志文件
1 2 3 4 5 6 cat filename -n number:给所有输出行编号 -s squeeze-blank:将所有连续的多个空行替换为一个空行 # 查找 record.log 中包含 AAA,但不包含 BBB 的记录的总数: cat -v record.log | grep AAA | grep -v BBB | wc -l
echo echo:输出
1 2 echo 'text' > a.txt # 覆盖写入 echo 'text' >> b.txt # 追加写入,如果文件不存在则创建
tee tee:读取标准输入的数据,并将内容输出成文件
1 2 3 4 5 tee -a # append,追加 tee -i # ignore-interrupts,忽略中断信号 tee file1 file2 # 在两个文件中复制内容 echo 'text' | tee -a file1 # 将text追加到file1
wc wc:打印行、字和字节数
1 2 3 4 5 wc 统计文本的行数、字数、字符数(word count) -m 统计文本字符数 -w 统计文本字数 -l 统计文本行数 ls |wc -l # 统计有多少个文件
tail/head tail -10 aa.log:文件的尾部 10 行,常用于查看日志输出
head -20 aa.log:文件的头部 20 行
1 2 3 4 tail -f aa.log # 实时查找,对于日志输出很有用 tail -5 -f firlename -5 显示指定行数 5 -f 执行后会等待,如果有新行添加到尾部,会继续输出新的行。常用来动态地看日志
pwd pwd:print working directory,显示当前工作目录的绝对路径
diff diff:比较单个文件或目录内容
1 2 3 4 5 6 7 -c 上下文模式,显示全部内文,并标出不同之处 -u 统一模式,以合并的方式来显示文件内容的不同 -a 只会逐行比较文本文件 -N 在比较目录时,若文件 A 仅出现在某个目录中,预设会显示:Only in 目录。若使用 -N 参数,则 diff 会将文件 A 与一个空白的文件比较 -r 递归比较目录下的文件 比较的时候忽略空白符 $ diff -w name_list.txt name_list_new.txt
tree tree:以树状格式显示文件目录
lsattr lsattr:list file attributes,显示文件扩展属性。
chattr :全拼 change file attributes,改变文件的扩展属性。
查 fzf fzf:fuzzy finder:基于 golang 的输入模糊关键词定位文件或文件夹。
find find:文件夹中查找文件或目录,支持正则,find [path][选项][expression]
locate:基于 mlocate 包,非实时查找,需提前建立与更新索引数据库,从而快速查询:locate string
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 28 find /home/user_name -name aa.py find ./ -size 0 |xargs rm -f &删除大小为零的文件 find . -name "*.py" find /etc -name "[A-Z]*.txt" -print # 删除两天前的文件 find ./ -ctime +2 -exec rm {} \; -print# 将匹配的文件输出到标准输出 -exec # 对匹配的文件执行该参数所给出的 shell 命令 -name # 按照文件名查找文件 -type # 查找某一类型的文件 -iname # 不区分大小 -gid -uid -group # 组 -user # 用户 -empty #查找所有空文件 -path -perm # 权限 644 -size # 大小 +5M # 大于5MB, 5M # 等于5MB -5M # 小于5MB -mount -nouser -nogroup -(a/m/c)time #访问时间、修改时间、改变时间 -maxdeoth # 目录
grep grep:global search regular expression and pring out the line:基于正则表达式查找满足条件的行
数据查找定位,select * from student where ... 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 28 29 30 31 32 33 34 35 36 37 grep pattern file -i 忽略大小写 -v 不显示匹配的行 -o 将每个匹配的内容用独立的行显示 -A n:当前行及后 n 行 -B n:当前行及前 n 行 -C n:当前行及前后 n 行 -E 使用扩展正则表达式 grep pattern -r dir/ # 递归搜索 在文件中查找字符串(不区分大小写) grep -n 'Complete' .vimrc 在.vimrc 中找到 Complete 并显示行数 # 输出成功匹配的行,以及该行之后的三行 grep -A 3 -i "example" demo_text 在一个文件夹中递归查询包含指定字符串的文件 $ grep -r "ramesh" * 更多示例:Get a Grip on the Grep! – 15 Practical Grep Command Examples ls -l | grep '.jar' 查找当前目录中的所有 JAR 文件 grep 'test' d* 显示所有以 d 开头的文件中包含测试的行。 grep 'test' aa bb cc 显示在 AA,BB,CC 文件中匹配测试的行。 grep '[a-z]{5}' aa 显示所有包含每个字符串至少有 5 个连续小写字符的字符串的行。 -c 计算找到‘搜寻字符串’(即 pattern)的次数 -i 忽略大小写的不同,所以大小写视为相同 -n 输出行号 -v 反向选择,打印不匹配的行 -r 递归搜索 --color=auto 将找到的关键词部分加上颜色显示
awk awk:根据定位到的数据行处理其中的分段,利器,but,Python 牛*。
名字来源于三个作者的简称 数据切片,select name from student sed sed:stream editor:流编辑器:根据定位到的数据行修改数据
数据修改,update student set name=.. 流程:从输入读取一行数扰 根据所提供的编辑器命令匹配数据 按命令修改流中的数据 将新的数据输出到 stdout 1 2 3 4 5 6 7 sed options script file # options -e # 该选项会将其后跟的脚本命令添加到已有的命令中 -f # 该选项会将其后文件中的脚本命令添加到已有的命令中 -n # 默认情况下,sed 会在所有的脚本执行完毕后,会自动输出处理后的内容,而该选项会屏蔽自动输出,需使用 print 命令来完成输出 -i # 此选项会直接修改源文件 # script
替换 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [address]s/pattern/replacement/flags # address:要操作的具体行 # pattern:要替换的内容 # replacement:要替换的新内容 # flag n # 0-512之间的数字,指定目标字符串第n次出现时才替换 g # 对数据中所有匹配的到的内容进行替换,若无g flag,只在第一次匹配成功时替换 p # 打印与替换命令中指定的模式匹配的行,此标记通常与-n选项一起使用 w file # 将缓冲区的内容写到指定的file文件 & # 用正则表达式替换 \n # 匹配第n个子串,该子串之前在pattern用\(\)指定 \ # 转义(&、\等) sed 's/test/trial/w test.txt' data2.txt sed 's/cat/dog/3' a.txt # 数字,用新文本替换第3处模式匹配的地方 sed -e 's/brwn/green/;s/dog/cat/' a.txt [address]c\用于替换的新文本 c 命令表示将指定行中的所有内容,替换成该选项后面的字符串。该命令的基本格式为: sed '3c\ > This is a changed line of text.' data6.txt
删除 1 2 3 4 5 6 7 8 9 [address]d # 不加行数,带-i参数会删除文件的所有内容 sed 'd' data1.txt # 删除第2、3行 sed -i '2,3d' a.txt # 删除第1-3行 sed '/1/,/3/d' data6.txt # 删除第3行至结尾 sed '3,$d' data6.txt
增 1 2 3 4 5 6 7 8 9 10 11 [address]a(或 i)\新文本内容 a # 匹配后添加 i # 匹配前添加 # 第三行前插入新行 sed '3i\ > This is an inserted line.' data6.txt # 第一行后插入多行 sed '1a\ > This is one line of new text.\ > This is another line of new text.' data6.txt
转换 1 2 3 4 [address]y/inchars/outchars/ # 对inchars与outchars进行一对一的映射(若长度不同,会r) sed 'y/123/789/' data8.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 p # 打印 c # 更改 y # 转换 N D P sed '$/.$//' filename # 将 dos 下的文件转为 unix,\r\n-->\n # 在第2行后添加 sed -i '2a\11111111111111' a.txt sed -a # 在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行 sed -c # 用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用"\"续行 sed -i # 在当前行之前插入文本。多行时除最后一行外,每行末尾需用"\"续行 sed -d # 删除行 地址除了可以写行号,还可以写正则表达式,用/ /之间的元字符表示 元字符 功能 示例 ^ 行首定位符 /^my/ 匹配所有以my开头的行 $ 行尾定位符 /my$/ 匹配所有以my结尾的行 . 匹配除换行符以外的单个字符 /m…y/ 匹配包含字母m,后跟两个任意字符,再跟字母y的
fuser fuser:查询给定文件或目录的用户或进程信息
1 2 3 4 5 fuser {file_path} -v # 显示更全的信息 # 一切皆文件w # 查看显卡使用者 sudo fuser -v /dev/nvidia*
打包与压缩 gz:即 gzip,通常仅能压缩一个文件。
tar:linux 系统下的打包工具, 仅打包,不压缩。
tgz:即 tar.gz:先用 tar 打包,再用 gz 压缩得到的文件。
zip:与 gzip 相似的算法,可打包压缩多个文件,压缩率低于 tgz
rar:打包压缩文件,最初用于 Dos,基于 Windows 系统。
在压缩比率上: tar.bz2>tgz>tar 占用空间与压缩比率成反比: tar.bz2 < tgz < tar 耗费时间(打包,解压) 打包:tar.bz2>tgz>tar 解压: tar.bz2>tar>tgz tar tar:打包为 .tar 的打包文件或解开(也可配合 -z 参数进行 gzip 对 .gz 文年的压缩或解压)
.tgz,可看作 .tar.gz 的缩写,使用上基本无区别,优先使用 .tgz,避免 windows 下的自动重命名时 a.tar(1).gz 这种情况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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 # .tar tarball tar -cvf aa.tar dirname/ # 创建 tar 文件,打包归档,非压缩,将文件夹打包到aa.tar tar -cvf test.tar aa.txt bb.txt # 将aa.txt与bb.txt打包到test.tar tar -xvf aa.tar -C dirname/ # 解压 tar 文件,将归档文件释放出来 # .tgz tar -zcvf examples.tgz examples # 调用gzip进行压缩 tar -zxvf examples.tgz -C /path # 调用gzip解压到指定路径 # .tar.bz,比.tgz压缩比率更大,占用空间更小,但解压时比较耗费CPU时间 tar -jxvf bbb.tar.bz2 dir_path # 解压到拽定咱径 tar -tvf aa.tar # 查看 tar 包含的文件 # 加密压缩 tar -czvf - {file_name} |openssl des3 -salt -pbddf2 -k user_name123456 | dd of={filename.tgz} tar -czvf - {file_name} |openssl des3 -salt -pbkdf2 -k user_name123456 -out /path/to/file.tgz # 加密压缩 tar -zcvf - {file_dir} |openssl des3 -salt -k password | dd of=xxx.tgz # 解密:带有 - ,将释放所有文件 # -k password可以不使用,执行完命令后会让你输入密码 dd if=xxx.tgz |openssl des3 -d -k password|tar zxf - # 加密解压 openssl des3 -d -k password -salt -in /path/to/file.tar.gz | tar xzf - /path/to/file_dir # 参数 必要参数,以下五个只能用到其中一个 -c create,建立压缩档案 -x 解压 -t 查看内容 -r 向压缩归档文件后追加文件 -u 更新原压缩包中的文件 -A 新增压缩文件到已存在的压缩 -B 设置区块大小 -c 建立新的压缩文件 -d 记录文件的差别 -r 添加文件到已经压缩的文件 -u 添加改变了和现有的文件到已经存在的压缩文件 -x 从压缩的文件中提取文件 -t 显示压缩文件的内容 -z 调用 gzip 进行.gz文件的压缩或解压 -j 支持 bzip2 解压文件 -Z 支持 compress 解压文件 -v 显示操作过程 -l 文件系统边界设置 -k 保留原有文件不覆盖 -m 保留文件不被覆盖 -W 确认压缩文件的正确性 配合以可选参数 -v -b 设置区块数目 -C 切换到指定目录 -f 指定压缩文件 --help 显示帮助信息 --version 显示版本信息
zip/unzip zip:打包并压缩成文件名为 .zip 的文件,无参数可解压,需要用 unzip 来解压
uzip:解压缩 zip 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # .zip zip file1.zip file1 zip -r file1.zip file1 file2 dir1 zip aa.zip hello.java sss.java bb.java # 加密压缩 zip -re filename.zip filename 回车,输入2次密码 zip -rP passwork filename.zip filename passwork是要输入的密码 # unzip 解压缩.zip unzip a.zip # 解压到当前文件夹 unzip -l a.zip # 显示 zip 里的内容 unzip -d /temp a.zip # 将 zip 里的内容解压到指定文件夹 unzip -l a.zip #显示 zip 内的内容 unzip -t test.zip # 查看 zip 文件是否损坏 unzip -v test.zip # 显示文件列表及对应的压缩比率 unzip -n -d /temp test.zip # 不覆盖已存在的文件 unzip -o -d /temp test.zip # 覆盖时不提示 # 加密解压 unzip filename.zip 按提示输入密码 unzip -P passwork filename.zip passwork是要解压的密码,这个不会有提示输入密码的操作
gzip/gunzip gzip:压缩成 .gz 的压缩文件,也可用 -d 选项变成解压
gunzip:将 .gz 压缩文件解压,也呆用 gzip 加 -d 参数代替
1 2 3 4 # .gz gzip -9 file1 # 最大程序压缩 gzip -d aa.gz # 解压.gz 文件 gzip -l aa.gz # 显示压缩比率
bzip2/bunzip2 bzip2:压缩成 .bz2 的压缩文件(也可用 -d 选项变成解压)
bunzip2:将 .bz2 压缩文件解压,也可用 bzip2 加 -d 选项代替
1 2 3 # .bz bzip2 filename bzip2 -d aa.bz2
rar/unrar rar:
1 2 3 # .rar rar a file1.rar filename1 filename2 rar x file1.rar
bzip2/bunzip2 1 2 3 # .bz bzip2 filename bzip2 -d aa.bz2
其他 compress:压缩成 .Z 的压缩文件,也可用 -d 参数变成解压
uncompress:将 .Z 压缩文件解压,也可用 compress 加 -d 参数代替
恢复 1 2 # ntfsundelete:需要先将对应的盘 umount ntfsundelete /dev/sda1 -t 3d # 最近 3 天删除的文件
用户与权限管理 用户属性
name:用户名 password:登录密码 uid:用户识别号 gid:用户的组的识别好 description:用户个人资料 home:用户的主目录,通常在/home 下,目录名与帐户名相同 shell:用户登录后启动的 shell,默认为/bin/bash 查看 /etc/passwd 1 cat /etc/passwd | grep user_name
id/users/who/whoami/logname id:显示用户当前的 uid、gid 与用户所属的组列表
w/who:查询 utmp 文件并显示当前系统用户及其运行的进程信息,查询 utmp 文件并报告当前登录的用户,默认输出包括用户名、终端类型、登录日期及远程主机
users/whoami/logname:显示当前用户的名称
groups:显示指定用户所属的组列表
login/logout login/logout:登录/退出登录
shutdown/reboot shutdown:关机
reboot:重启
1 2 3 4 5 6 7 8 # 关闭系统并立即关机 shutdown -h now # 10 分钟后关机 shutdown -h +10 # 重启 shutdown -r now # 重启期间强制进行系统检查 shutdown -Fr now
pwck pwck:检测帐户
last/lastlog/lastb last:显示每月登录的用户信息
lastlog 显示最近登录用户的用户名、登录端口和登录时间
lastb 显示登录系统失败用户的相关信息
logger 允许用户将自己的消息发送到日志工具中
su su:substitute user:切换用户,su username 超级用户使用这个命令可以切换到任何其他用户而不用输入密码
passwd passwd:密码设置,passwd username 先输入旧密码,再输入新密码
1 passwd -d username # 删除密码
useradd/userdel/usermod useradd:用户添加
userdel:
usermod:修改已有的用户信息
newusers:批量添加/更新一组帐户
1 2 3 4 5 6 7 8 9 10 useradd m user_name # 添加用户 passwd user_name # 设置用户密码 userdel -r user_name # 带 r 时会删除/home 目录下的用户目录 usermod -G group_name user_name # 将 user_name 用户添加到 group_name 组 usermod -g group_name user_name # 将 user_name 用户添加到 group_name 组,并从原组织删除 # 配置用户不能访问别人的用户目录 cd /home sudo chmod 760 ./*
chage chage:密码过期
sudo sudo 允许授权用户执行超级用户或者其它用户的命令
id 显示用户的 id 以及群组的 id
1 2 3 sudo -i # 提升用户权限 sudo -s # 打开特殊的 shell sudo su # 进入root权限
groupadd/groupdel/groupmod 相关文件
groups:显示组
groupadd:添加组
groupdel:删除组帐户
groupmod:修改组
newgrp
权限管理 文件权限 文件权限 1 2 3 4 5 6 7 8 9 10 11 12 $ ls -l total 16 ----rw-r-- 1 morvan morvan 34 Oct 12 09:51 t1.py -rw----r-- 1 morvan morvan 80 Oct 12 09:57 t2.py -rw-rw-r-- 1 morvan morvan 12 Oct 12 09:56 t3 -rwxrw-r-- 1 morvan morvan 55 Oct 13 17 :28 t.py d rwx r-x r-x Type : 很多种 (最常见的是 - 为文件, d 为文件夹, 其他的还有 l, n … 这种东西, 真正自己遇到了, 网上再搜就好, 一次性说太多记不住的).User: 后面跟着的三个空是使用 User 的身份能对这个做什么处理 (r 能读; w 能写; x 能执行; - 不能完成某个操作). Group: 一个 Group 里可能有一个或多个 user, 这些权限的样式和 User 一样. Others: 除了 User 和 Group 以外人的权限.
在这里, 像 -rw-rw-r-- 这种, 就是权限的说明. 细节展示在下面的图中. 在下图中, 这串字符得拆成 4 个部分,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ls -l drwxr-xr-x 3 user_name user_name 4096 05-16 # d rwx r-x r-x # type user 拥有者权限 group 所属用户组权限 other 其他用户权限d: type:文件类型 - d:目录 - l:软链接 - b:块设备 - c:字符设备 - s:socket:网络套接字 - p:管道 - -:普通文件 rwx:421:7 755 - 7:用户:r+w+x:4+2+1,所有者有读取、写入、执行的权限 - 5:组:r+x:4+0+1,同组用户只有读取、执行权限 - 5:任何人:r:4+0+0,其他用户只有读取权限
d:目录 r:Read,读,4 ,读取内容;浏览目录, w:Write,写,2 ,新增/修改;删除移动 x:eXecute,执行,1 ,运行;进入 1 2 3 4 5 6 drwxr-xr-x 22 user_name user_name 4096 4 月 27 01:48 project # 目录,可读定执行 7,执行读 3,执行 1 -rw-r--r-- 1 user_name user_name 3841532 5 月 18 1999 razorback.mp3 # 普通文件,rw 读写 6,r2,r2 -r-------- 所有者仅可读(4),组及其他无任何权限(0)
chmod chmod:change mode:设置文件或目录的权限,读取、写入、执行的权限
1 2 3 4 5 6 7 8 9 10 chmod [谁] [怎么修改] [哪个文件] chmod ugo +rwx file/dir chmod u+r test.py # 给指定文件的属主和属组所有权限(包括读、写、执行) chmod ug+rwx script1.sh chmod g-rwx script1.sh chmod a+x myscript # 增加脚本可执行权限 chmod -R ug_rwx dir1 # 递归修改权限 chmod -R ugo+rwx dir1 # 权限大开,user,group,others可读写执行
[谁]:
u:对 User 修改 g:对 Group 修改 o:对 Others 修改 a:对 all 修改 [怎么修改]:
, -, =: 作用的形式, 加上, 减掉, 等于某些权限 r, w, x 或者多个权限一起, 比如 rx[哪个文件]
chown chown:change owener:改变文件或目录的拥有者或所属群组
1 2 chown user_name:user_names ./aa.py 拥有者改为 user_name,属组改为 user_names -R
chgrp chgrp:CHange GRouP 改变文件或目录的所属群组
groupadd\groupdel\groupmod 群组管理
用户登录记录与相关状态 /var/log:这里的文件包含了大量的信息: 连接时间日志–由多个程序执行,把纪录写入到/var/log/wtmp 和/var/run/utmp,login 等程序更新 wtmp 和 utmp 文件,使系统管理员能够跟踪谁在何时登录到系统。进程统计–由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacct 或 acct)中写一个纪录。进程统计的目的是为系统中的基本服务提供命令使用统计。 错误日志–由 syslogd(8)执行。各种系统守护进程、用户程序和内核通过 syslog(3)向文件/var/log/messages 报告值得注意的事件。另外有许多 UNIX 程序创建日志。像 HTTP 和 FTP 这样提供网络服务的服务器也保持详细的日志。 常用的日志文件如下:
access-log 纪录 HTTP/web 的传输
acct/pacct 纪录用户命令
aculog 纪录 MODEM 的活动
btmp 纪录失败的纪录
lastlog 纪录最近几次成功登录的事件和最后一次不成功的登录
messages 从 syslog 中记录信息(有的链接到 syslog 文件)
sudolog 纪录使用 sudo 发出的命令
sulog 纪录使用 su 命令的使用
syslog 从 syslog 中记录信息(通常链接到 messages 文件)
utmp 纪录当前登录的每个用户
wtmp 一个用户每次登录进入和退出时间的永久纪录
xferlog 纪录 FTP 会话
utmp、wtmp 和 lastlog 日志文件是多数重用 UNIX 日志子系统的关键–保持用户登录进入和退出的纪录。有关当前登录用户的信息记录在文件 utmp 中;登录进入和退出纪录在文件 wtmp 中;最后一次登录文件可以用 lastlog 命令察看。数据交换、关机和重起也记录在 wtmp 文件中。所有的纪录都包含时间戳。这些文件(lastlog 通常不大)在具有大量用户的系统中增长十分迅速。例如 wtmp 文件可以无限增长,除非定期截取。许多系统以一天或者一周为单位把 wtmp 配置成循环使用。它通常由 cron 运行的脚本来修改。这些脚本重新命名并循环使用 wtmp 文件。通常,wtmp 在第一天结束后命名为 wtmp.1;第二天后 wtmp.1 变为 wtmp.2 等等,直到 wtmp. 7。
每次有一个用户登录时,login 程序在文件 lastlog 中察看用户的 UID。如果找到了,则把用户上次登录、退出时间和主机名写到标准输出中,然后 login 程序在 lastlog 中纪录新的登录时间。在新的 lastlog 纪录写入后,utmp 文件打开并插入用户的 utmp 纪录。该纪录一直用到用户登录退出时删除。utmp 文件被各种命令文件使用,包括 who、w、users 和 finger。
下一步,login 程序打开文件 wtmp 附加用户的 utmp 纪录。当用户登录退出时,具有更新时间戳的同一 utmp 纪录附加到文件中。wtmp 文件被程序 last 和 ac 使用。
wtmp 和 utmp 文件是二进制文件,需要使用:who、w、users、last 和 ac 来查看 1 2 3 4 5 6 7 # 查看登录和退出时间 last -f /var/log/wtmp (1)-p:显示每个用户的连接时间 (2)-d:显示每天的连接时间 (3)-y:显示年份,和-d配合使用 /var/log/secure 文件寻找可疑IP登陆次数
系统管理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 系统版本信息 uname -m && cat /etc/*release # cpu信息 lscpu # 内存信息 lsmem # GPu显卡信息 nvidia-smi pip install gpustat gpustat -i
系统服务 init init:改变系统运行级别
systemctl systemctl:管理服务的主要工具, 它整合了 chkconfig 与 service 功能于一体。
1 2 3 4 5 6 7 8 9 systemctl is-enabled mysqld.service #查询服务是否开机启动 systemctl enable mysqld.service #开机运行服务 systemctl disable mysqld #取消开机运行 systemctl start mysqld #启动服务 systemctl stop mysqld #停止服务 systemctl restart mysqld #重启服务 systemctl reload mysqld #重新加载服务配置文件 systemctl status mysqld #查询服务运行状态 systemcta --failed #显示启动失败的服务
1 2 3 systemctl start mysqld # 相当于 service mysqld start
1 2 3 # 没有systemctl时需要用chkconfig添加开机自启动 chkconfig --list chkconfig sshd on
dmesg dmesg:diagnostic message:查看最后一次系统引导的日志(开)
硬件管理 一切皆文件 1 2 3 4 5 6 7 8 9 10 11 cat /proc/version # 系统内核信息 cat /proc/cpuinfo cat /proc/cpuinfo | grep processor |wc -l # cpu 核的个数 cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c # 查看有几个逻辑cpu, 包cpu型号 # L1/L2/L3 cached cat /sys/devices/system/cpu/cpu0/cache/index0/size # index1/size cat /proc/meminfo arch # 显示架构 lshw -c video # 查看 GPU显卡 sudo lspci | grep -e VGA
显卡 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # nvidia显卡驱动卸载 sudo /usr/bin/nvidia-uninstall # nvidia显卡驱动安装 # 命令行模式 # 获取可用驱动信息 ubuntu-drivers devices # 前面找 driver,后面找 recommend # 安装 sudo apt install nvidia-driver-xxx # 或者 sudo ubuntu-drivers autoinstall # 安装完成后重启 sudo reboot now # 重启后查看显卡状态 nvidia-smi # 重新加载NVIDIA内核模块 sudo modprobe nvidia # 查看驱动程序是否成功加载 lsmod | grep nvidia
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 28 # 最全的查看显卡信息 lshw -c video lspci | grep -i vga # 得到的十六进制的可以从:http://pci-ids.ucw.cz/mods/PC/10de/2204中查看 # nvidia-smi nvidia-smi -pm 1 # 开启持久模式 # 调整运行功率,保证最大功率时候的温度不会超过75C sudo nvidia-smi -pl 200 lspci | grep -i nvidia nvidia-smi -L # 查看型号 nvidia-smi -q # 查询所有GPU的相关信息 nvidia-smi -q -i 0 # 查询0号GPU的相关信息 nvidia-smi -q -f xx.txt # 将查询的信息输出到文件 # 重置 GPU 状态,可用于清除双位 ECC 错误或 恢复挂起的 GPU。需要 -i 切换到目标特定设备。 仅在 Linux 上可用。 nvidia-smi --gpu-reset nvidia-smi -r # windows下: 1. 在“设备管理器”的“显示适配器”选项卡下,找到驱动程序 2. 禁用它 3. 按 Win + Ctrl +Shift + B(显示器将闪烁) 4. 启用驱动程序
lspci/dmidecode/biosdecode/lscpu dmidecode:全面的硬件浏览
biosdecode:bios 信息
lspci:查看硬件插槽
lsmod:显示 linux 内核的模块信息
lscpu:查看 cpu 的相关信息
1 2 3 # manjaro mhwd # 查 gpu 驱动 inxi -FX # 所有硬件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 lscpu Architecture: #架构 CPU(s): #逻辑 cpu 颗数 Thread(s) per core: #每个核心线程 Core(s) per socket: #每个 cpu 插槽核数/每颗物理 cpu 核数 CPU socket(s): #cpu 插槽数 Vendor ID: #cpu 厂商 ID CPU family: #cpu 系列 Model: #型号 Stepping: #步进 CPU MHz: #cpu 主频 Virtualization: #cpu 支持的虚拟化技术 L1d cache: #一级缓存(google 了下,这具体表示表示 cpu 的 L1 数据缓存) L1i cache: #一级缓存(具体为 L1 指令缓存) L2 cache: #二级缓存
uname uname:显示一些重要的系统信息,例如内核名称、主机名、内核版本号、处理器类型之类的信息
screenfetch screenfetch:显示系统相关信息
显卡状态 遇到的问题:显卡风扇在转,但系统中无法 lshw 到显卡信息:电通了,但接触不良,需要重新拔插下 1 2 3 4 5 6 7 8 # 查看显卡信息 lspci | grep -i nvidia lspci | grep -i vga # 查看指定显卡的详细信息("00:0f.0" 是显卡的代号) lspci -v -s 00:0f.0 nvidia-smi
时间配置 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 date # 显示系统当前时间与日期 timedatectl status # 查看所有可用时区 timedatectl list-timezones # 设置上海时区 timedatectl set-timezone "Asia/Shanghai" # 设置世界时,即UTC timedatectl set-timezone UTC # 设置时间 timedatectl set-time 15:58:30 # 设置日期 timedatectl set-time 20151120 # 设置日期和时间 timedatectl set-time '16:10:40 2015-11-20' # 硬件时钟 timedatectl | grep local # 硬件时钟设置为本地时区 timedatectl set-local-rtc 1 # 硬件时钟设置为世界时 timedatectl set-local-rtc 0
性能监控 top top/htop:显示、管理执行中的程序,动态监控
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 28 29 30 31 top top - 15:12:36 up 33 min, 4 users, load average: 0.90, 0.91, 1.02 # 系统当前时间 系统运行时间 当前登录用户数 过去 1 分钟 5 分钟 15 分钟的平均负载 1 核为 1、8 核为 8 任务: 305 total, 1 running, 304 sleeping, 0 stopped, 0 zombie # 总的进程数 正在运行的进程数 睡眠的进程数 停止的进程数 僵尸进程数 % Cpu(s): 12.3 us, 5.2 sy, 0.0 ni, 81.5 id , 0.1 wa, 0.8 hi, 0.1 si, 0.0 st # us: 用户模式占用的 CPU 百分比 # sy:系统模式... # ni:改变过优先级的用户占用的 # id :CPU等待输入输出的进程占用的(空闲CPU)# hi: 硬件中断请求服务占用的 CPU # si: 软件中断请求占用的 CPU # st:虚拟时间即虚拟机 CPU 占用 MiB Mem : 15950.2 total, 6405.0 free, 6602.1 used, 2943.1 buff/cache # 物理内存总量,单位为 kb 空间内存 已使用的 作为缓冲的内存量 MiB Swap: 0.0 total, 0.0 free, 0.0 used. 7965.8 avail Mem # 交换分区总量... PID USER PR NI VIRT RES SHR %CPU %MEM TIME+ COMMAND 2347 user_name 20 0 1197184 538296 239120 S 18.2 3.3 7:41.88 chromium PID: 进程号 USER: 进程所属用户 PR: 优先级,数值越小优先级越高 NI: 优先级,数值越小优先级越高 VIRT: 进程占用的虚拟内存大小,单位为 kb RES: 常驻内存,进程占用的物理内存的大小,单位为 kb SHR: 共享内存大小,单位为 KB,即一个进程的实际占用内存的 RES-SHR S:进程状态 S 睡眠,R 运行 % CPU: 占 CPU 百分比 % MEM: 占内存百分比 TIME+: 共占用的 CPU 时间 COMMAND: 进程名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 当服务器拥有多个 cpu 的时候可以使用“1”快捷键来切换是否展示显示各个 cpu 的详细信息; <Space>:立即刷新 s:设置刷新时间间隔 c:显示完整的程序命令 t::显示或隐藏进程和 CPU 状态信息 m:显示或隐藏内存状态信息 l:显示或隐藏 uptime 信息 f:增加或减少进程显示标志 S:累计模式,会把已完成或退出的子进程占用的 CPU 时间累计到父进程的 MITE+ # P:按%CPU 使用率降序 # T:按 MITE+排行 # M:按%MEM 内存使用率降序 u:指定显示用户进程 r:修改进程 renice 值 b:高亮显示当前运行进程 kkill:进程 i:只显示正在运行的进程 W:保存对 top 的设置到文件^/.toprc,下次启动将自动调用 toprc 文件的设置。 h:帮助命令。 q:退出 # 显示指定的进程信息 top -p pid
uptime uptime:系统负载 - 用了多久
1 2 3 [user_name@user_nameer ~]$ uptime 07:32:10 up 43 min, 6 users , load average: 0.26, 0.53, 0.51
free free:以字节为单位输出内存使用量
Linux 与 Windows 不同,Windows 是只在需要内存时才为应用程序分配内存,Linux 是无论物理内存多大,将对其充分利用。采用划分出 cache、buffers 来实现buffer:缓冲:在写入数据时,先将分散的写入操作保存到内存中,当达到一定程度再集中写入硬盘,减少磁盘碎片和硬盘的反复寻道,加速数据的写入过程(但一定程度延缓了数据的写入) cache:页高速缓存:将读取出来的数据保存在内存中,再次读时直接从内存中读取,加快数据读取 1 2 3 4 5 6 7 8 9 10 11 12 13 14 free -t 汇总 -g GB -m MB -k KB -b 字节 total 总计 used 已用 free 空闲 共享 缓冲/缓存 可用 内存: 15949 2620 11535 289 1793 12741 交换: 0 0 0 total:物理内存总大小 used:已使用的物理内存大小 free:空闲的物理内存大小 shared:多个进程共享的内存大小 buffers/cached:磁盘缓存的大小
vmstat vmstat:Virtual Meomory statistics:虚拟内存统计信息,可实时动态监视操作系统的虚拟内存、进程、CPU 活动。
iostat-iotop 1 2 3 4 5 6 7 8 9 10 11 12 13 14 iostat -x 1 10 Linux 5.4.0-42-generic (dl) 08/10/2020 _x86_64_ (8 CPU) # cpu 用户模式,带 nice 的用户模式,系统模式,等待输入输出完成时间,维护另一个虚拟处理器,空间时间 avg-cpu: %user %nice %system %iowait %steal %idle 7.79 0.00 1.00 0.06 0.00 91.15 Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd loop0 0.00 0.00 0.00 0.00 934 0 0 loop1 0.00 0.00 0.00 0.00 4062 0 0 sda 3.05 187.98 147.20 167.51 307487357 240780505 274011344 sdb 0.79 52.61 130.98 0.00 86061868 214254484 0 sudo iotop -oP
注:如果%iowait 的值过高,表示硬盘存在 I/O 瓶颈,%idle 值高,表示 CPU 较空闲,如果%idle 值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量。%idle 值如果持续低于 10,那么系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU。 pmap pmap:进程的内存使用情况
nvidia-smi nvidia-smi:nvidia 显卡状态
显示 说明 Fan 风扇转速(0%–100%),N/A 表示没有风扇 Temp GPU 温度(GPU 温度过高会导致 GPU 频率下降) Perf 性能状态,从 P0(最大性能)到 P12(最小性能) Pwr GPU 功耗 Persistence-M OFF/ON,持续模式的状态(持续模式耗能大,但在新的 GPU 应用启动时花费时间更少) Bus-Id GPU 总线,domain🚌device.function Disp.A Display Active,表示 GPU 的显示是否初始化 Memory-Usage 显存使用率 Volatile GPU-Util GPU 使用率 ECC 是否开启错误检查和纠正技术,0/DISABLED, 1/ENABLED Compute M. 计算模式,0/DEFAULT,1/EXCLUSIVE_PROCESS,2/PROHIBITED
TCC/WDDM:NVIDIA 高性能 GPU(如 Tesla, Quadro)可以配置为 TCC(Tesla Compute Cluster)模式或 WDDM(Windows Display Driver Model)模式。 二者区别在于,TCC 模式下,GPU 完全用于计算,并不需要本地显示功能;而 WDDM 模式下,GPU 同时扮演计算卡 + 显卡的角色。 显存占用和 GPU 占用是两个不一样的东西,显卡是由 GPU 和显存等组成的,显存和 GPU 的关系有点类似于内存和 CPU 的关系。跑 caffe 代码的时候显存占得少,GPU 占得多,跑 TensorFlow 代码的时候,显存占得多,GPU 占得少。
nvidia-smi -pm 1:设定持久模式,没人用 GPU 时驱动不自动卸载,一直处于加载模式如果不加载这个,driver 频繁卸载加载,GPU 频繁被初始化,会导致 GPU 死机,CPU 访问 PCIe config registers 时间过长导致 softlock。 1 2 # 屏蔽指定显卡 nvidia-smi drain -p 0000:89:00.0 -m 1
ethstatus- 带宽 1 2 ip a # 查看网卡名 ethstatus -i {网卡名}
磁盘管理 du-df-lsblk-fdisk du:Disk Usage:显示目录或者文件所占的磁盘空间
lsblk:列出块设备
df:disk free:显示文件系统的磁盘使用情况,默认 df -k 字节为单位
fdisk:显示磁盘分区情况
1 2 3 4 5 6 7 8 9 df -k kb -h humen -T 类型 du -sh * -s 统计汇总 -h --max-depth=1 当前目录下一级子文件和子目录占用的磁盘容量 lsblk -f # 查看硬盘格式
mkfs mkfs:格式化
1 2 3 4 mkfs.ext4 /dev/sdb1 # 将硬盘格式化为 ext4 格式 sudo blkid #查看电脑上所有硬盘分区的卷标及 uuid sudo fdisk -l # 查看硬盘所在路径,挂载的节点
sync sync:将缓存同步到磁盘
awk awd:格式化文本语言
mount-umount mount:挂载文件系统
umount:卸除文件系统
1 2 mkdir /data sudo mount /dev/sdb1 /data
parted:磁盘分区工具
自动挂载 1 2 3 4 5 6 7 8 9 10 11 12 13 # 开机自动挂载 lsblk # 确认待挂载分区设备名: 如/dev/sdb1 # 查看 uuid ls -l /dev/disk/by-uuid # sudo vi /etc/fstab,在/的下一行添加/dev/disk/by-uuid/xxxxxx /data ext4 defaults 0 0 <file system> <mount point> <type> <options> <dump> <pass> 第 1 列是设备名或者卷标,如/dev/sda1 第 2 列是挂载点(也就是挂载目录),如/mnt/data 第 3 列是所要挂载设备的文件系统或者文件系统类型,如 auto(自动侦测)、ext2、ext3 等 第 4 列是挂载选项,通常使用 defaults 就可以,如 auto(系统自动挂载),defaults( rw, suid, dev, exec, auto, nouser, and async.),noauto(开机不自动挂载),nouser(只有超级用户可以挂载),user 任何用户都可以挂载等 第 5 列设置是否使用 dump 备份,置 0 为不备份,置 1,2 为备份,但 2 的备份重要性比 1 小 第 6 列设置是否开机的时候使用 fsck 检验所挂载的磁盘,置 0 为不检验,置 1,2 为检验,但置 2 盘比置 1 的盘晚检验
dd dd:Disk Dump
1 2 # ISO 写入 U 盘 dd if==/home/user_name/Documents/hello.iso of=/dev/sdb1
mdadm mdadm:raid 设置工具
LVM 磁盘扩充 Ubuntu Linux 安装时默认 / 只占用了 200G, 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 查看 df -h # 使用剩下的所有扩展到LVM中 sudo lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv # 扩展指定的大小(当然扩充大小不能大于磁盘实际剩余大小) sudo lvextend -L 50G /dev/mapper/ubuntu--vg-ubuntu--lv # 对上面的操作应用上(重新计算) resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv # 查看 lvdisplay vgdisplay
用户管理 1 2 3 4 5 6 7 8 # 添加组 sudo groupadd docker # 将用户添加到组 sudo useradd -a -G docker user_name # 文件夹权限配无思无虑 chmod 770 -R /home/path chmod +s /home/path # #### 确保之后添加进去的文件夹也继承同样的权限
网络管理 相关文件 /etc/sysconfig/network:系统网络配置文件,包含主机最基本的网络信息用于系统启动/etc/sysconfig/netword-scripts/ifcfg-ethX:以太网接口配置文件/etc/sysconfig/network-scripts/route-ethX:以太网接口的静态路由配置文件/etc/hosts:完成主机名映射为 IP 地址的静态解析功能/etc/resolv.conf:配置域名服务客户端的配置文件,用于指定域名服务器的位置/etc/host.conf:配置域名服务客户端的控制文件netstat 列出所有端口 (包括监听和未监听的):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 netstat -a netstat -ntl 查看端口占用情况 * netstat -anp | grep 3306 # 端口是否被占用 # 参数 -t: TCP 端口 -u: UDP 端口 -l: 仅显示监听套接字 -p: 显示进程标识符和程序名称,每个套接字/端口属于一个程序 -a:显示本机所有连接和监听地端口 -n:网络 IP 地址的形式,显示当前建立的有效连接和端口 -r:显示路由表信息 -s:显示按协议的统计信息 -v:显示当前有效的连接 -t:显示所有 TCP 协议连接情况 -u:显示所有 UDP 协议连接情况 -i:显示自动配置端口的状态 -l:仅仅显示连接状态为 listening 的服务网络状态 -p:显示 pid/program name
列出所有 tcp 端口:
列出所有有监听的服务状态:
看 -hostname-ip-ifconfig hostname:显示主机名
ip:ip a:查看 ip
ifconfig:设置网络接口
nmtui nmtui:终端连网
ping ping:Packet InterNet Grouper:检测网络的连通性
arping arping:发送 arp 请求到一个相邻主机
能 Ping 通、ssh 服务已开,但无法通过该 IP ssh 登录
1 2 arping -l etho 192.168.1.1
telnet telnet:远程登入
tc tc:显示和维护流量控制设置
ssh ssh:secure shell,登录到远程主机
linux 默认打开,sshd 服务,监听端口 22 1 2 3 4 5 6 7 ssh -V ssh # 查看 ssh口 netstat -anp | grep ssh # 修改ssh端口 vi /etc/ssh/sshd_config
1 2 3 4 5 6 7 8 9 10 11 # 默认端口为 22 netstat -anp |grep 22 # 查看端口占用 netstat -anp |grep ssh # 查看进程占用的端口 sudo vi /etc/ssh/sshd_config # port 22 这行 systemctl restart sshd.service # 修改后,需要在防火墙iptables等规则中进行放行
scp scp:SSH:基于 ssh 协议的文件传输
1 2 3 4 5 6 7 8 9 10 11 # 上传 scp /path/filename username@servername:/path/ scp -r local_dir username@servername:remote_dir # 上传目录 # 下载 scp username@servername:/path/filename /var/www/local_dir(本地目录) scp -r username@servername:/var/www/remote_dir/(远程目录) /var/www/local_dir(本地目录) # 参数 scp -P port_number /path/to/local/file username@remote_host:/path/to/remote/directoryx # -P:指定要连接的端口号 scp -v /path/to/local/file username@remote_host:/path/to/remote/directory # 显示详细的传输过程信息 scp -n /path/to/local/file username@remote_host:/path/to/remote/directory # 跳过已存在的文修的
wget wget:下载工具:支持 HTTP\HTTPS\FTP 三个常见 TCP/IP 协议的网络下载工具,wget=world wide web+get
1 2 3 4 5 6 7 8 9 wget http://www.baidu.com #index.html wget -O /home/user_name/aa.html http://www.baidu.com #output-document,指定下载目录和文件名 wget –limit-rate=300k http:/.... wget -i file.txt #从 file.txt 下载多个文件 wget -b 后台下载 wget -o download.log URL 将软件输出信息保存到文件;-a 为追加 wget -c http://www.baidu.com #断点续传 wget --file-user=USERNAME --file-password=PASSWORD url #ftp 下载 -t,--tries=NUMBER 是否下载次数(0 表示无穷次)
进程管理 进程状态
R:runnable:运行 (正在运行或在运行队列中等待) S:sleeping 中断 (休眠中, 受阻, 在等待某个条件的形成或接受到信号) D:uninterruptible sleep:不可中断 (收到信号不唤醒和不可运行, 进程必须等待直到有中断发生) Z:zombie/defunct:僵死 (进程已终止, 但进程描述符存在, 直到父进程调用 wait4() 系统调用后释放) T:traced or stopped 停止 (进程收到 SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU 信号后停止运行运行) ps-pstree ps:Processes Status:正在运行的进程的信息。
pstree:pstree:查看进程间关系
1 2 3 4 5 6 7 8 9 10 11 12 ps -aux | grep :显示所有进程与状态 -a 终端机下的所有进程,包括其他用户的 -A 所有进程 -e 所有进程 -c 显示真正的指令名称,不包含路径、参数等提示 -f 用 ASCII 字符显示树状结构,表示进程间的相互关系 -u 以用户为主的格式显示 -x 后台进程运行的参数 -o 自定义格式 # 状态,父进程,进程ID,启动时间,运行时间,命令 ps -eo ostat,ppid,pid,lstart,etime,cmd ps -ef
1 2 3 4 5 6 7 8 9 10 11 12 13 user_name 716 0.2 0.5 739704 84564 ? Sl 09:56 0:07 albert USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND USER: 进程拥有者 PID: pid % CPU: 占用的 CPU 使用率 % MEM: 占用的记忆体使用率 VSZ: 占用的虚拟记忆体大小 RSS: 占用的记忆体大小 TTY: 终端的次要装置号码 (minor device number of tty) STAT: 该行程的状态,linux 的进程有 5 种状态: START: 进程开始时间 TIME: 执行的时间 COMMAND:所执行的指令
kill-sleep kill:杀掉执行中的程序或工作(本意是用来向进程发射信号的)
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 28 29 30 ps aux | grep chromium # 查询 chromium 的进程 kill -s 9 pid # -s 9 为传递给进程的信号为 9,即强制、尽快终止进程 # 查看所有信号 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 signal.SIGTERM:请求进程终止运行,也可以称为默认终止信号。 signal.SIGKILL:立即终止进程的运行,无法被捕获或忽略。 signal.SIGINT:相当于键盘上 Ctrl+C 的中断信号,通常用于请求应用程序退出。 signal.SIGSTOP:请求进程暂停运行,可以被恢复(通过 SIGCONT)。 # 常用 kill -2 pid # 中断进程 kill -9 pid # 强制关闭 kill -15 pid # 正常关闭
sig 值 说明 SIGABRT 异常终止 SIGFPE 浮点错误 SIGILL 非法指令 SIGINT Ctrl+C 信号 SIGSEGV 非法存储区访问 SIGTERM 终止请求
nohup nohup:不挂断地运行命令,用户退出系统后程序继续工作
1 2 3 nohup python aa.py >my.log & # 加上&,后台运行程序, jobs -l #只能查看当前终端 ps -ef
1 2 3 nohup python test.py >> train.log 2>&1 & # nohup :# >> train.log
nohup:不挂断地运行,即在退出帐号时继续运行python train_net.py:运行 Python 程序,注意由 VS Code 的项目管理机制,需 cd 到项目的文件夹再运行 Python 程序>> train.log:将运行 Python 程序时的输出输出到指定文件,如 train.log2>&1:将错误内容重定向输入到标准输出中,即在 train.log 会有正常 print 的标准输出,及如果程序出错了的报错。0 表示 stdin 标准输入,用户键盘输入的内容1 表示 stdout 标准输出,输出到显示屏的内容2 表示 stderr 标准错误,报错内容&:置于后台运行pidof-pkill-bg-fg-jobs pidof:打印出正在运行的程序的进程 ID
bg:使一个被挂起的进程在后台执行
fg:挂起程序
jobs:显示后台程序
1 2 3 4 pidof chromium # 查出来 kill pid_id # 作掉 kill -USR2 $(pidof chromium) pkill -f chromium # 直接作掉
资源限制 ulimit ulimit:获取或设置指定资源的使用限制。
进程的资源限制通常是在系统初始化时由 init 进程建立的,然后由每个后续进程继承。这就意味着为了影响一个用户的所有后续进程,需要将资源限制的设置构造在 shell 之中(如 bash 中的 ulimit) 超出资源限制值会报错?而不是最大只能使用这么多?不太实用的样子 利器 at-crontab at:在特定的时间执行一次性的任务
atq:列出用户的计划任务,如果是超级用户将列出所有用户的任务,结果的输出格式为:作业号、日期、小时、队列和用户名
atrm:根据 job number 删除 at 任务
batch:在系统负荷允许的情况下执行 at 任务,就是在系统空闲的情况下才执行 at 任务
at 指定模式当于的 hh:mm(小时: 分钟)的时间指定,若时间已过去,则置于第二天,如 04:00 能使用 midnight、noon、teatime(饮茶时间,一般是下午 4 点)等模糊的词语来指定时间 12 小时计时制,即在时间后加上 AM 或 PM,如 12pm 能指定命令执行的具体日期,指定格式为 month day 或 mm/dd/yy 或 dd.mm.yy,指定的日期必须跟在指定时间的后面。如:04:00 2009-03-1 相对计时法:如 now + 5 minutes 04pm + 3 days 能够直接使用 today(今天)、tomorrow(明天)来指定完成命令的时间。 1 2 3 4 5 6 7 8 9 10 11 at [选项] [时间] Ctrl + D 结束 at 命令的输入 -m 当指定的任务被完成后,将给用户发送邮件,即使没有标准输出 -I atq 的别名 -d atrm 的别名 -v 显示任务将被执行的时间 -c 打印任务的内容到标准输出 -V 显示版本信息 -q <队列> 使用指定的队列 -f <文件> 从指定文件读入任务而不是从标准输入读入 -t <时间参数> 以时间参数的形式提交要运行的任务
crontab:cron table,任务调度,定时执行任务
cron:系统服务 crond,重复运行某些被设定好确定的运行时间的任务,每月、每周、每天、甚至每分钟运行。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 crontab -u -u:指定用户 -e:编辑 -l:显示 crontab 文件, -r:删除某个用户的 crontab 文件,若不指定用户,则默认删除当前用户的 crontab -i:在删除用户的 crontab 文件时出示确认提示 设置一个每十分钟执行一次的计划任务 */10 * * * * /home/ramesh/check-disk-space # 分 时 日 月 星期 # 分 minute[0-59]时 hour[0-23]日 day[1-31]月 month[1-12]周 week[0-7],0 或代表星期日 ***** command # 默认每分钟执行一次 3,15 * * * * command # 每小时第 3 和第 15 分钟执行 3,15 8-11 */2 * * command # 每隔两天的上午 8 点到 11 点的第 3 和第 15 分钟执行 3,15 8-11 ** 1 command # 每个星期 1 的上午 8 点到 11 点的第 3 和第 15 分钟执行 30 9 * * * systemctl mysqld restart # 每天 9:30 重启 mysqld */15**** /home/user_name/test.sh
nice:用指定的优先级运行命令
renice:修改优先级
convert convert:格式转换利器
1 2 3 4 5 6 7 8 9 10 11 convert xxx.jpg xxx.png convert xxx.gif xxx.bmp convert xxx.tiff xxx.pcx convert -resize 1920x1080 xxx.jpg new_xxx.jpg convert -sample 50%x50% xxx.jpg new_xxx.jpg convert -rotate 270 xxx.jpg new_xxx.jpg # 在图像的 10,80 位置采用 60 磅的全黑 Helvetica 字体写上 Hello, World! convert -fill black -pointsize 60 -font helvetica -draw 'text 10,80 "Hello, World!" ‘ hello.jpg helloworld.jpg # 将 png 连接成 gif convert -layers Optimize -delay 4/100 png/output*.png clip.gif
回收站 1 2 3 4 5 6 shell sudo apt install trash-cli echo "alias rm='trash-put'" >> ~/.bashrc source ~/.bashrc
参考:开源项目 基本操作:trash-put:将文件或目录移入回收站;trash-empty:清空回收站;trash-list:列出回收站中的文件;restore-trash:还原回收站中的文件;trash-rm:删除回首站中的单个文件; 附 Shell 编程 常识 初始目标:shell 编程:基本语法、shell 变量、表达式、shell 脚本、shell 流程控制 Now:了解 Shell 常识即可,Python 脚本为主,Python 牛* $var :对变量取值$$ :进程号$0 :命令名# :注释输入输出 变量 1 2 3 4 declare name name = user_name echo $name echo Number_{1..5} # 花括号展示
环境变量 环境变量:可由系统、用户、Shell 以及其他程序来设定,可赋值为数字、文本、文件名、设备以及其他类型的数据
环境变量的名称一般是大写的(约定俗成)PATH:决定了 shell 将到哪些目录中寻找命令或程序HISTSIZE:历史记录数LOGNAME:当前用户的登录名HOSTNAME:指主机的名称SHELL:当前用户 Shell 类型LANGUGE:语言相关的环境变量,多语言可以修改此环境变量MAIL:当前用户的邮件存放目录PS1:基本提示符,对于 root 用户是 #,对于普通用户是 $ HOME:当前用户主目录set:显示当前 Shell 所有变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量。env:显示与当前用户相关的环境变量,还可以让命令在指定环境中运行。export:显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量。echo $PATH添加环境变量时使用绝对路径。 1 2 3 4 /etc/profile 全局用户,应用于所有的Shell。 /$ HOME/.profile 当前用户,应用于所有的Shell。 /etc/bash_bashrc 全局用户,应用于Bash Shell。 ~/.bashrc 局部当前,应用于Bash Sell。
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 28 29 30 31 32 33 34 35 # 临时环境变量 # 会立即生效,但窗口关闭后会失效 export PATH=$PATH:/要添加的路径 # PATH: 变量名,指添加以 PATH 这个环境变量中 # $PATH : 指把新添加的环境变量与原先的环境变量重新赋值给 PATH 这个变量(多个变量间是用:分隔的)# 自定义任意变量名 路径值 export MyVar=/usr/local/dev # 引用方法 以:分割 加$引用 export PATH=$PATH:$MyVar/sdk/go/bin:$MyVar/sdk/java/bin # 永久生效 # /etc/bashrc:系统全局环境变量设定 # 1.指定用户: vi ~/.bashrc,在其后添加 export PATH=$PATH:/要添加的路径 # 然后,source ~/.bashrc # 针对单个用户有效的环境变量配置和启动程序 # 2. 指定用户:vi ~/.bash_profile,在其后添加 export PATH=$PATH:/要添加的路径 # 然后,source ~/.bash_profile # /etc/profile:系统级的环境变量和启动程序,会对所有用户生效 # 3. 所有用户:vi /etc/profile,在其后添加 export PATH=$PATH:/要添加的路径 # 然后,source /etc/profile # env 查看所有环境变量env | grep PATH export TEST="Test.." # unset 清除环境变量unset TEST
首先读入全局环境变量设定档 /etc/profile,然后根据其内容读取额外的设定的文档,如 /etc/profile.d 和 /etc/inputrc; 根据不同使用者帐号,于其家目录内读取 ~/.bash_profile; 读取失败则会读取 ~/.bash_login; 再次失败则读取 ~/.profile(这三个文档设定基本上无差别,仅读取上有优先关系); 最后,根据用户帐号读取 ~/.bashrc。 helloworld 1 2 3 4 5 6 7 # !/bin/bash for ((i=0; i<10; i++))do echo "helloworld" done exit 0
1 2 chmod 755 helloworld.sh ./helloworld.sh
命令行写入文件的权限问题 1 2 3 4 5 6 # bash将一个字串作为完整命令来执行,从而将sudo 的影响拓展到整条命令 sudo bash -c 'echo "nameserver 114.114.114.144" >> /etc/resolv.conf' # 管道+tee ,让tee 带sudo ,从标准输入中读入信息并将其写入标准输出或文件中 echo "nameserver 114.114.114.144"|sudo tee -a /etc/resolv.conf # 提升shell权限 sudo -s # sudo su -root
常用参数 1 2 3 4 cmd [-options] [arguments] # 三元素:命令 选项 参数 -单字符 --单词
-aall,全部,所有 (ls\lsattr\uname) archive: 存档(cp\rsync) append: 附加(tar -A,7z) -bblicksize:块大小,带参数(du,df) batch: 批处理模式 -ccommands:执行命令,带参数 creat: 创建 -ddebug:调试 delete:删除 directory:目录(ls) -eexecute:执行,带参数(xterm, perl) edit:编辑 exclude:排除 -fforce:强制,不经确认(cp, rm, mv) file:文件,带参数(tar) configuration file : 指定配置文件 (有些守护进程拥有此选项,如 ssh , lighttpd) -h–help:帮助 human readable:人性化显示(ls,du,df) headers:头部 -iinteractive:交互模式,提示 (rm, mv) include:包含 -k-llong listing format:长格式(ls) list:列表 load:读取(gcc, emacs) -mmessage:消息(cvs) manual:手册(whereis) create home:创建 home 目录(usermod, useradd) -nnumber : 行号、编号 (cat , head , tail , pstree , lspci) no : (useradd , make) -ooutput : 输出 (cc , sort) options : 选项 (mount) -pport : 端口,带参数 (很多网络工具拥有此选项,如 ssh , lftp ) protocol : 协议,带参数 passwd : 密码,带参数 -q-rreverse : 反转 recursive : 递归 (cp , rm , chmod -R) -ssilent : 安静 size : 大小,带参数 subject -t-u-v-w-x-y-zzip : 启用压缩 (bzip , tar , zcat , zip , cvs) 遇到的问题 写 log,文件大小为 0 文件大小为 0 是因为 Linux 对写入内容不是马上写入,而是缓存到一定大小后一次性写入。 默认好像 4kb 写一次。多运行一段时间可以看到写入的内容。也可以按需设置立即写入 Linux 默认页大小为 4KB:以页为单位管理内存,即将磁盘数据加载到内存或将内存中的数据写入磁盘,操作系统是以页为单位来操作的。 /boot 配置的大小太小,需清理旧的内核 1 2 3 4 5 6 7 8 uname -a dpkg --get-selections | grep linux sudo apt purge linux-image-3.19.0-20-generic # 或sudo apt remove linux-image-3.19.0-20-generic sudo apt purge linux-headers-3.19.0-20-generic sudo apt purge linux-modules-3.19.0-20-generic # 手动更新配置 sudo update-grub2 sudo reboot now
Failed to initialize NVML: Driver/library version mismatch原因:因为联网 ubuntu 自己把 GPU 的驱动更新了,导致 Nvidia 显卡 Kernel Module 与 Driver Version 不一致 1 2 3 4 5 6 7 8 9 sudo apt-get install dkms cd /usr/src ls # 打开nvidia开头的,后缀就是版本号 sudo dkms install -m nvidia -v 410.79 sudo apt-mark hold nvidia-driver-525
问题:NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running 原因分析:这个错误是由于 linux 内核版本自动更新,内核版本与驱动版本不适配的原因,为了确保以后不会再出现该问题, 方案一:优先 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # 查看已安装的内核 dpkg --get-selections | grep linux-image unmae -a sudo apt-get install dkms # 470.82.00 是在 ll /usr/src 中看到的 sudo dkms install -m nvidia -v 470.82.00 # 标用内核自动更新 sudo vi /etc/apt/apt.conf.d/10periodic # 将双引号中的 1 全部改为 0 ,然后保存 # --- 附 --- # 关闭内核更新,使用当前内核 sudo apt-mark hold linux-image-generic linux-headers-generic linux-image-generic set on hold. linux-headers-generic set on hold. # 重启内核更新 sudo apt-mark unhold linux-image-generic linux-headers-generic
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 # --- 1、固定内核版本 --- uname -r uname -a cd /boot ls sudo vi /etc/default/grub # 修改为需要的版本 # --- 修改内容: START --- GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.4.0-90-generic" # --- 修改内容: END --- sudo update-grub # 更新 /etc/default/grub文件里修改 # --- 2、重新安装驱动 --- sudo apt purge nvidia* ubuntu-drivers devices sudo apt-get install nvidia-driver-495 nvidia-settings nvidia-prime #一般安装推荐的就行 ll /usr/src/ #查看是否安装好 这里有个问题可能会由于gcc版本过低问题而报错无法生成deb包,因此我们还需修改gcc版本,在修改完gcc版本后再去进行第三步就行。 # --- 3、重新生成deb包 --- sudo apt install dkms sudo dkms install -m nvidia -v 495.44 sudo reboot #重启
xx are installed in ‘/home/user_name/.local/bin’ which is not on PATH 1 2 3 4 5 6 vi ~/.bashrc # 在文件最后添加路径,该路径来源于第一步中安装 pip 时发出的警告 export PATH=/home/user_name/.local/bin:$PATH # 保存后,激活之 source ~/.bashrc
问题:lesspipe: command not found 解决方案:运行下面这行,实现命令行内可以正常使用 bin 下的命令,比如 source、ls 等 1 export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
WARNING:You do not appear to have an NVIDIA GPU supportedd by the xxx.xxx.xx NVIDIA Linux graphics driver installed in this system. 解决方案: Linux 下不能连接: ppa.launchpad.net 的问题(中科大软件源) 替换: 1 2 3 4 sudo vi /etc/apt/sources.list.d/ubuntu-toolchain-r-ubuntu-test-xenial.list # 将文件中http://ppa.launchpad.net替换为https://launchpad.proxy.ustclug.org deb https://launchpad.proxy.ustclug.org/ubuntu-toolchain-r/test/ubuntu xenial main sudo apt-get update
Nvidia 驱动安装 问题:Linux 的 Nvidia 驱动安装时:The target kernel has CONFIG_MODULE_SIG set, which means that it supports cryptographic signatures on kernel modules. On somex systems, the kernel may refuse to load modules without a valid signature from a trusted key. This system also has UEFI Secure Boot enabled; many distributions enforce module signature verification on UEFI systems when Secure Boot is enabled. Would you like to sign the NVIDIA kernel module? 解决方案:BIOS 中关闭 secureboot, 问题:NVIDIA A 100-PCIE-40 GB with CUDA capability sm_80 is not compatible with the current PyTorch installation. The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_70 sm_75. If you want to use the NVIDIA A 100-PCIE-40 GB GPU with PyTorch, please check the instructions at Start Locally | PyTorch CUDA 版本 最小算力 收到弃用消息,但仍然可以运行 默认算力 最大算力 5.5 以前 1.0 N/A 1.0 6.0 1.0 1.0 1.0 6.5 1.1 1.x 2.0 7.x 2.0 N/A 2.0 8.0 2.0 2.x 2.0 6.2 9.x 3.0 N/A 3.0 7.0 10.x 3.0 N/A 3.0 7.5 (3.0 deprecated in 10.2) 11.x 3.5 3.x, 5.0 5.2 8.6 (11.0:8.0, 11.1:8.6)
支持的 CUDA 算力是与安装的 cuda 的版本有关的,cuda 10.2 仅仅支持 3.7,5.0,6.0,7.0 算力,不支持 8.0 算力。而 cuda 11 是支持 8.0 算力的。 需要装 cuda 11.0 + 对应的 PyTorch
1 2 pip install torch==1.7 .1 +cu110 torchvision==0.8 .2 +cu110 torchaudio==0.7 .2 -f https://download.pytorch.org/whl/torch_stable.html
1 2 3 GeForce RTX 3060 with CUDA capability sm_86 is not compatible with the current PyTorch installation. The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_70. If you want to use the GeForce RTX 3060 GPU with PyTorch, please check the instructions at https://pytorch.org/get-started/locally/
问题: The following packages have been kept back 解决方案:因为某个软件包的依赖关系发生了改变,如果要升级这些软件包,必须安装依赖包,这些软件包就会被列在”The following packages have been kept back”里面。sudo apt-get dist-upgrade:强制更新软件包到最新版本,并自动解决缺少的依赖包 问题:buff/cache 占用过高 解决方案: buff(Buffer Cache)是一种 I/O 缓存,用于内存和硬盘的缓冲,是 io 设备的读写缓冲区。根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。 cache(Page Cache)是一种高速缓存,用于 CPU 和内存之间的缓冲 ,是文件系统的 cache。 清除 buff/cache sync:将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件 echo 1 > /proc/sys/vm/drop_caches:清除 page cache echo 2 > /proc/sys/vm/drop_caches:清除回收 slab 分配器中的对象(包括目录项缓存和 inode 缓存)。slab 分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的 pagecache。 echo 3 > /proc/sys/vm/drop_caches:清除 pagecache 和 slab 分配器中的缓存对象。 /proc/sys/vm/drop_caches 的值,默认为 0 1 2 3 4 > sync > echo 1 > /proc/sys/vm/drop_caches> echo 2 > /proc/sys/vm/drop_caches> echo 3 > /proc/sys/vm/drop_caches
1 2 3 4 # 禁用所有交换 swapoff -a # 重新打开交换 swapon -a
nginx 非 root 用户可启动 1 2 3 4 5 6 7 8 9 chown root:root nginx chmod 755 nginx chmod u+s nginx # 测试 nginx -t # 重启nginx nginx -s reload
bus error(core dumped) 原因:更新时 .so 文件没有更新完整