常用unix命令 
通用快捷键 
Ctrl + A:光标移至最左侧 Ctrl + K:剪切光标起始位置至行尾 (配合清空整行命令);Ctrl + E: 光标移至最右侧 Ctrl + U:剪切光标起始位置至行首 (配合清空整行命令);Ctrl + L:清屏 (clear命令)Ctrl + C:中止当前正在执行的命令;Ctrl + W:以单词为单位向左剪切 Ctrl + Y:粘贴。
文件和目录 
- pwd:显示当前目录路径 ;
- which:查看可执行文件的路径(注意是可执行文件)。 如:- which node、- which nginx;
- ls:- -l: 显示当前目录下的文件和目录详细(包含权限信息)列表;
- -a:显示当前目录下所有(包含隐藏文件和目录)列表。
 
- du:- -ah:列出文件夹下各个文件和目录的占用大小 ;
- -sh:统计当前目录占用内存大小。
 
- cat:显示文件内容,适合小文件,两屏内信息;- -n:显示行号,一般配合- | grep 'xxx'等使用起到快速查看- xxx所在行数效果;
 
- less:- d键: 前进半页- u键:后退半页;
- 空格键:前进一页- b键:后退一页;
- q键:停止读取- /键:搜索模式 ,搜索后按- n键跳到下一个,按- N键跳到上一个,同时也可以输入正则表达式匹配。
 
- grep: 文本检索- -i:忽略大小写- -r:递归查找 。
- number:显示行号;
 
- head: 查看文件开头几行- tail:查看末尾几行。 (使用场景1 :查询日志)- -n: 行数,默认10;
- -f:每隔1s更新文件内容;
- -s:指定-f实时刷新时间间隔,单位s;
- 日志查询:日志一般都是尾部为最新日志,可通过 tail -n 30 test.log查看最新30行的信息;
- 日志搜索:根据报错消息关键字搜索日志,可通过 cat -n test.log | grep 'xxx'获取到关键字对应行号。假设行号为100,此时再通过cat -n test.log | tail -n +70 | head -n 60查询到100行上下30行的附近消息(tail -n +70表示查看70行之后的消息 。head -n 60表示只看前60行消息);
- cat -n test.log | tail -n +70 | head -n 60 | > temp.log:将上述搜索到的信息写入到临时文件- temp.log(发送给其他人查看)。
 
- touch:创建一个文件(创建并编辑用- vim);
- mkdir: 创建一个目录(递归创建- mkdir -p one/two/three);
- cp: 拷贝文件和目录- mv:移动文件或目录- cp file file_copy:- file是目标文件,- file_copy是拷贝出来的文件;
- cp file one/file_copy: 把- file拷贝到- one目录下,且重命名为- file_copy;
- cp *.txt folder: 把当前目录下所有- txt文件拷贝到- folder目录下;
- -r:递归的拷贝,常用来拷贝一整个目录。
 
- rm: 删除文件或目录- -f文件强制删除;
- -r递归删除文件夹,著名的删除操作- rm -rf;
- 项目中使用rimraf库卸载node_modules文件(npm i -g rimraf)。
 
json
// scripts in package.json
"reset": "rimraf node_modules package-lock.json yarn.lock && npm i"- ln:- ln file fileln:创建- fileln为- file的硬链接,对于硬链接来说,删除任意一方的文件,共同指向的文件内容并不会从硬盘上删除。只有同时删除了 file 与fileln 后,它们共同指向的文件内容才会消失;
- ln -s file fileln: 创建- fileln软连接,类似快捷方式。 删除- file会导致- fileln无法访问;
- 当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间;
- 无论是软链接还是硬链接,文件都保持同步变化。创建软链接时,如果软链接文件跟源文件不在同一个目录,那么源文件地址必须为绝对路径,否则创建出来的软链接无法使用;
- 不能针对目录创建硬链接(原因:主要是linux为了防止类似引用循环作出的限制,具体可自行网上了解)。
 
- find: 文件查找 (可使用- ag/rg替代)- find -name "file.txt": 当前以及子目录下通过名称查找文件。
 
文件权限管理 
drwxr-xr-x 表示文件或目录的权限, 权限的整体是按照用户划分,通过-分割。顺序为: 文件属性 - 所有者 - 群组用户 - 其他用户。
- 按照权限解读如下: - 类型 d:- d表示目录,就是说这是一个目录,普通文件是- -,链接是- l
- 写 r:- read表示文件可读。
- 读 w:- write表示文件可写,一般有写的权限,就有删除的权限。
- 可执行 x:- execute表示文件可执行。
- 无 -:表示没有相应权限。
 
- 按照用户划分解读如下: - d:是一个文件夹
- rwxr:所有者具有读、写、可执行权限;
- xr: 群组用户具有读、可执行权限,没有写权限;
- x:其他用户具有可执行权限,没有读、写权限。
 
- chmod:修改访问权限,- -r可以递归修改- 通过数字修改: 4读--2写--1可执行。如7 = 4+2+1,代表rwx- chmod 731 test.txt: 代表- drwxr-xr-x
 
- 通过字母修改 - u:user 的缩写,用户的意思,表示所有者。
- g:group 的缩写,群组的意思,表示群组用户。
- o:other 的缩写,其它的意思,表示其它用户。
- a:all 的缩写,所有的意思,表示所有用户。
- +:加号,表示添加权限。
- -:减号,表示去除权限。
- =:等于号,表示分配权限。
- chmod u+rx file: 为文件- file的所有者添加- rx权限
- chmod u=rwx,g=r,o=- file
 
 
- 通过数字修改: 
- chown: 修改目录所有者- chown peigoz /works:修改works目录的所有者为- peigoz用户
- chown peigoz:user /works:修改works目录的所有者为- user用户组下的- peigoz用户
- -R:递归修改
 
进阶 
压缩解压 
- tar: 压缩文件夹为- .tar。- tar -cvf sort.tar sort: 将- sort文件夹归档为- sort.tar- -cvf:表示- create(创建)+- verbose(细节)+- file(文件),创建归档文件并显示操作细节;
- -tf:显示归档里的内容,并不解开归档;
- -rvf:追加文件到归档,- tar -rvf archive.tar file.txt;
- -xvf:解开归档,- tar -xvf archive.tar;
- -zcvf:直接二次压缩为- gzip,- tar -zcvf archive.tar.gz archive;
- -zxvf:直接将- gzip解开为文件,- tar -zxvf htop-3.0.0.tar.gz
 
- gzip:压缩- tar为- gzip- gunzip: 解压- gzip为- tar- 压缩后后缀名为.tar.gz
 
- 压缩后后缀名为
- zip/unzip:“压缩/解压”- zip文件(- zip压缩文件一般来自- windows操作系统)。
网络和进程 
- ifconfig: 查看- ip网络相关信息,如果命令不存在的话, 执行命令- yum install net-tools安装。- eth0对应有线连接(对应有线网卡),就是用网线来连接的上网。
- lo表示本地回环(- Local Loopback的缩写,对应一个虚拟网卡)可以看到它的- ip地址是- 127.0.0.1。每台电脑都应该有这个接口,因为它对应着“连向自己的链接”。这也是被称之为“本地回环”的原因。所有经由这个接口发送的东西都会回到你自己的电脑。
- wlan0表示无线局域网
 
- host:- ip地址和主机名的互相转换
- ssh:连接远程服务器,- ssh 用户@ip:port,可通过配置文件(- ~/.ssh/config)配置- ssh别名,或者配置- bash命令(- ~/.bash_profile) 简化操作。
- ps:用于显示当前系统中的进程,- ps命令显示的进程列表不会随时间而更新,是静态的,是运行- ps命令那个时刻的状态或者说是一个进程快照,- ps -ef列出所有进程;
- top:获取进程的动态列表。- top -o cpu按照- CPU使用排序;
- kill:结束- pid进程 ,- kill pid1 pid2;
- scp:通过网络,把文件从一台电脑拷贝到另一台电脑。(可使用- rz和- sz替代)- scp root@192.168.1.5:/root/file.txt file.txt:表示把远程电脑上的- file.txt文件拷贝到本机
 
Vim 
- 模式: - 交互模式:默认模式,可剪切、粘贴、撤消等;
- 插入模式:文本输入;
- 命令模式:保存、退出、命令等;
- 可视模式:高级输入,例如同时插入多行;
 
- 状态流转: txt- => 输入`i`进入插入模式,按`esc`返回交互模式 交互模式 => 输入`:`进入命令模式,输入命令按回车自动返回交互模式 => 使用`Ctrl + V`进入块可视模式,按`esc`返回交互模式
- 交互模式: - 0/Home:光标跳转行首;- $/End:光标跳转行尾;- w:按单词移动;
- dd:删除光标所在行;- dw:删除光标后一个单词;- 数字 + dd/dw:删除多行/单词;
- d0:从光标所在位置删除至行首;- d$: 从光标所在位置删除至行末;
- yy/yw/y0/y$:复制;
- p:粘贴- dd或者- yy的内容 ;- r:替换;- u:撤消;
- 数字+gg跳转指定行;- G:跳转最后一行;- gg:跳转至第一行;
- /:向后查找;- ?:向前查找;- n: 跳转下一个;- N:跳转上一个。
 
- 命令模式: - wq/x:保存并退出 ;- q!:不保存且退出;
- 替换光标所在行所有旧字符串为新字符串: s/旧字符串/新字符串/g;
- 全文替换: %s/旧字符串/新字符串/g;
- 替换第几行到第几行中所有字符串:2,4 s/one/two/g。
 
- 可视模式:可通过方向键同时操作多行 - d键,表示删除选中;- I键,表示在选中之前插入;
- u键,表示选中变为小写;- U键,表示选中变为大写。
 
- ~/.vimrc
sh
set number " 显示行号
syntax on " 激活语法高亮
set showcmd " 实时看到输入的命令
set ignorecase " 搜索时不区分大小写
set mouse=a " 激活鼠标,用鼠标选中时相当于进入可视模式
// ... 更多配置参考:<https://www.ruanyifeng.com/blog/2018/09/vimrc.html>PM2 
- 启动:pm2 start app.js --watch -i 2 -n myapp- --watch:监听应用目录的变化,一旦发生变化,自动重启。(实际更多通过配置文件)
- -i:启用多少个实例,可用于负载均衡。如果- -i 0或者- -i max,则根据当前机器核数确定实例数目。
- -n:应用的名称。查看应用信息的时候可以用到
 
- 停止:pm2 stop app_name|app_id
- 全部停止:pm2 stop all
- 查看应用列表:pm2 list
- 重启:pm2 restart app.js|app_name|app_id
- 重载:pm2 reload app.js|app_name|app_id- 区别:集群模式下,由于 pm2的restart命令会先杀掉所有进程,再重新拉起,会造成服务终止。但是reload命令可以实现 重启,维护升级的时候不需要停机。
- 当重载时间过长或者无法重载时,pm2会自动切换成restart
 
- 区别:集群模式下,由于 
- 查看应用详细消息:pm2 show|info|describe app_name|app_id
- 查看应用运行状态:pm2 monit
- 查看日志:pm2 logs app_name|app_id
- 其他:在docker容器中使用pm2启动应用时,要使用pm2-runtime(一个docker包)而不是pm2 start, 因为pm2是默认后台启动的,docker感知不到,CMD命令执行完成,docker容器就结束了(导致容器服务停止)。 所以直接使用node app.js(pm2-runtime底层实际命令)启动应用后,应用才能一直在容器中保持运行。