玩命加载中🤣🤣🤣

日常查询


Git

git push -u origin dev-dee ## 推送远程分支
git branch -D 分支名  ## 强制删除分支
git push origin -d 分支名  ## 强制删除远端分支
git branch -m 新分支名 | git branch -m 旧分支名 新分支名  ## 分支重命名
git fetch --prune  ## 更新远端分支列表

git stash list  ## 查询暂存区
git stash show -p 缓存id  ## 查询具体某个stash变更内容
git stash push -m 'xxx'  ## 暂存并取名
git stash drop stash@{0}  ## 删除某一个暂存

git fetch origin dee:dee  ## 拉取远端分支,并在本地新建分支
git fetch origin dev  ## 获取远程dev分支但不做合并
git pull origin dev  ## git fetch origin dev + gti merge
git pull origin dev:master  ## 获取远程的dev分支和本地的master分支合并
git merge --bort  ## 撤销合并

npm i -g git-br
git br
git config branch.develop.description 分支备注
  • 删除git中.idea文件
-- 1. 修改.gitignore文件
-- 2. 删除本地缓存区.idea文件
git rm --cached -r .idea
-- 3. 推送
git commit -m 'delete .idea'
git push origin dev

进程端口命令

# linux
lsof -i:80  #根据端口查看PID及应用名
netstat -ntlp #查看当前所有tcp端口
netstat -ntulp|grep 80 #查看所有80端口使用情况
netstat -ntulp|grep nginx  #根据应用名查看端口
netstat -nlp |grep LISTEN #查看当前所有监听端口
top -Hp pid  #查看某个进程下所有子线程

#win
tasklist | findstr xxx  # 查看进程 ps -ef
taskkill /T /F /PID 12345  # 杀死进程 kill -9
netstat -ano|findstr 80  # 端口查看

# 查询某个进程位置(以nginx为例)
netstat -ntulp|grep 80
ll /proc/<pid>/exe # 根据上一步查询出来的进程号查询nginx位置
/usr/local/nginx/sbin/nginx -t # 


[root@bigrule nginx]# ll /proc/28543/exe
lrwxrwxrwx 1 root root 0 Dec  9 16:49 /proc/28543/exe -> /usr/local/nginx/sbin/nginx

## 查询进程并杀死
sudo kill -15 $(ps -ef|grep nginx|awk '{print $2}')
ps -ef|grep nginx | grep -v grep|awk '{print $2}'|xargs -i kill -15 {} # 优先

npm

npm常用操作

其他linux常用命令

文件查询 find

# linux查找文件
find / -iname *abc*  ## 全局搜索 (-iname 不区分大小写 -name区分大小写)
find / -type d -iname *abc* ## 搜索文件夹

find / -size +100M ## 大于100M的文件
find ./ -maxdepth 1 -iname aaa ## 搜索文件夹aaa, 只在当前目录下搜索,不会递归子目录
├── xxx
│   ├── aaa  √
│   │   ├── a1
│   │   ├── a2
│   │   └── aaa  ×
│   ├── bbb
│   ├── ccc
find / -name a1 -exec rm -rf {} \;  ## 查找并删除这些文件(末尾有个;)
find /logs/ -type f -min +30  ## 查询/logs/文件夹下修改时间30分钟之外的所有文件

用户/权限 user&chmod

useradd -r -g <username>  ## 添加用户,-r 系统用户(用于运行服务) -g 放入组里
id <username>  ## 查找用户
groups <groupname>  ## 查找组
userdel -r <username>  ## 删除用户
groupdel <groupname>  ## 删除组

chmod 755 <name> # user,group,other r=4,w=2,x=1
chmod -R +x <name> ## 递归给 <name> 增加执行权限
chown <user>:<group> <name>

yum

yum search ifconfig
yum install net-tools
yum info net-tools
yum list jdk   查看安装过的包

sed

sed [option] [script] [file]
option: -i 原地编辑 -r 支持扩展正则 -n 抑制默认输出(明确告诉它什么时候打印,它才会打印)
## 说明: 不加[option]是默认输出的,可以用作调试

##### 举例
sed -i 's/old/new/g' file  ## s:替换 g:全局替换(如果不加只替换每一行的第一个) 
sed -i '5c balabala'  file  ## 把第5行整行换成 balabala
sed -i '/mysql/d' file  ## 删除包含mysql的行
sed '/^#/d' file  ## 删除注释并打印
sed -n '5,8p' file  ## -n 抑制默认打印; 5,8p 打印5到8行

环境变量相关 env&export

env  ## 查询所有环境变量
export VARNAME=vlue  ## 设置环境变量
unset VARNAME  ##取消环境变量

日志&压缩相关

journalctl -u '服务名' -f -n 行数
cp /dev/null nohup.out  # 不重启服务清空nohup文件
tar zxvf 压缩包 -C 路径  ## gzip extract verbose file
tar zcvf 压缩  ## gzip create verbose file

zip -r 压缩包名.zip 文件1 文件2 文件n  ## 把a.txt、b.log打包进zip文件中 -r 递归
zip -r /home/test.zip /home/test  ## 
unzip -n /home/test.zip -d /home/test ## 解压缩 -n 解压缩时不覆盖原有文件; -d 执行目录

文件传输 scp

  1. 配置 ssh 免密登录 ssh-keygen -t rsa -b 2048 -> 回车 -> 回车 -> 回车
  2. ssh-copy-id root@192.168.123.xxx(输入对方密码)
  3. 推送文件

windows 下找不到 ssh-copy-id 命令解决方案

%% 先执行以下内容
function ssh-copy-id([string]$userAtMachine, $args){   
    $publicKey = "$ENV:USERPROFILE" + "/.ssh/id_rsa.pub"
    if (!(Test-Path "$publicKey")){
        Write-Error "ERROR: failed to open ID file '$publicKey': No such file"            
    }
    else {
        & cat "$publicKey" | ssh $args $userAtMachine "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1"      
    }
}
## 推送文件
scp [本地路径] [服务器用户名]@[服务器地址]:[上传路径]
scp /home/1.txt root@192.168.123.123:/home/2.txt  ## 此处有个改名字的操作

## 推送文件夹中所有文件
scp [本地路径]/* [服务器用户名]@[服务器地址文件夹]/*:[上传路径]
scp /home/filein/* root@192.168.123.126:/home/fileout/  ## 本身不包括文件夹本身

## 推送文件夹
scp -r [本地路径] [服务器用户名]@[服务器地址]:[上传路径]
scp -r /home/testdir/ root@192.168.123.126:/home/test/  ## 此处有个改文件夹名字的操作

## 拉取文件
scp [服务器用户名]@[服务器地址]:[服务器路径] [本地路径]
scp root@192.168.123.126:/home/testdir/1.txt /home/2.txt  ## 此处有个改名字的操作

## 拉取文件夹中所有文件
scp [服务器用户名]@[服务器地址]:[服务器路径文件夹]/* [本地路径]
scp /home/filein/* root@192.168.123.126:/home/fileout/  ## 不包括文件夹本身

## 拉取文件夹
scp -r [服务器用户名]@[服务器地址]:[服务器路径] [本地路径] 
scp -r root@192.168.123.126:/home/testdir/ /home/test/  ## 此处有个改文件夹名字的操作

## scp 说明:文件夹推送和拉取的情况下,如果目标文件夹是已存在(如 /home/),那么会将源地址的文件夹也拷贝过来;如果目标文件夹不存在(如 /home/aaa/),那么会将源地址的文件夹重命名成目标文件夹

日常linux排查

7788

uptime -p  ## 查看Linux运行时长

CPU/MEM整体 top

  • 查看内存, CPU
  • 查看负载 load average 三个值相加/3 > 60% 则说明系统压力重。如果是4核,那就是 > 240%

CPU间隔读取 vmstat

vmstat -n 2 3

一般 vmstat 工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数单位是秒,第二个参数是采样的次数

  • procs

    • r:运行和等待 CPU 时间片的进程数,原则上1核的 CPU 的运行队列不要超过2,整个系统的运行队列不能超过总核数的2倍,否则代表系统压力过大

    • b:等待资源的进程数,比如正在等待磁盘 I/O、网络 I/O 等。

  • cpu

    • us:用户进程消耗 CPU 时间百分比,us 值高,用户进程消耗 CPU 时间多,如果长期大于50%,优化程序

    • sy:内核进程消耗的 CPLU 时间百分比;

    • id:处于空闲的 CPU 百分比

    • wa:系统等待 IO 的 CPU 时间百分比

    • st:来自于一个虚拟机偷取的 CPU 时间的百分比

附:

查看所有 CPU 核信息 mpstat -P ALL 2

每个进程使用 CPU 的用量分解信息 pidstat -u 1 -p <pid>

空闲内存 free

free -h / free -m

在20%到70%之间内存基本够用

附:

pidstat -p 进程号 -r 采样间隔秒数

pidstat -p -r 2

磁盘分区/大小 df/lsblk

[root@haigui ~]# lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda               8:0    0 136.1G  0 disk 
├─sda1            8:1    0     1G  0 part /boot
└─sda2            8:2    0 135.1G  0 part 
  ├─centos-root 253:0    0    50G  0 lvm  /
  ├─centos-swap 253:1    0  13.6G  0 lvm  [SWAP]
  └─centos-home 253:2    0  71.5G  0 lvm  /home
sdb               8:16   0   1.8T  0 disk 
└─sdb1            8:17   0   1.8T  0 part /mnt

查看磁盘剩余空间数

磁盘IO间隔读取 iostat

iostat -xdk 2 3(2秒钟取一次,总共取3次)

  • rkB/s 每秒读取数据量 kB
  • wkB/s 每秒写入数据量 kB
    • rkB/s、wkB/s 根据系统应用不同会有不同的值,但有规律遵循:长期、超大数据读写,肯定不正常,需要优化程序读取
  • svctm I/O 请求的平均服务时间,单位毫秒
  • await I/O 请求的平均等待时间,单位毫秒;值越小,性能越好
    • svctm 的值与 await 的值很接近,表示几乎没有 I/O 等待,磁盘性能好
    • 如果 await 的值远高于 svctm 的值,则表示 I/O 队列等待太长,需要优化程序或更换更快磁盘
  • %util 一秒中有百分之几的时间用于 I/O 操作。接近 100% 时,标识磁盘带宽跑满,需要优化程序或者增加磁盘

网络IO ifstat

安装

wget http://gael.roualland.free.fr/ifstat/ifstat-1.1.tar.gz
tar zxvf ifstat-1.1.tar.gz
cd ifstat-1.1
./configure
make
make install

综合步骤

  1. top 找到 CPU 占比最高的
  2. pe -ef 或者 jps 找到程序
  3. 定位到具体线程或者代码
    • ps -mp 进程 -o THREAD, tid, time
      • -m 显示所有的线程
      • -p pid 进程使用 cpu 的时间
      • -o 该参数后是用户自定义格式
  4. 将需要的线程ID转换为16进制格式(英文小写格式)
    • printf “%x\n” 有问题的线程ID
  5. jstack 进程ID | grep tid(16进制线程ID小写英文) -A60

附:

pidstat -d 2 -p

日期

linux日期

date  ## 更新日期
ntpdate cn.pool.ntp.org ## 同步当前时间

java日期

// 格式化日期
String now = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
String now = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");  // lang3包下的工具类
String now = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
String now = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

// 解析日期
Date parse = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2023-12-12 12:12:12");  // 要处理异常 Tue Dec 12 12:12:12 CST 2023
LocalDateTime parse = LocalDateTime.parse("2023-12-12 12:12:12", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));  // 2023-12-12T12:12:12

// 相互转换
// 1.Date => LocalDateTime
Date date = new Date();
LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();

// 2.LocalDateTime => Date (不常用, 因此多写点备注)
LocalDateTime localDateTime = LocalDateTime.now();
Date date = Date.from(localDateTime
                      // 时区的日期和时间(系统默认时区)
                      .atZone(ZoneId.systemDefault())
                      // 转为即使时间
                      .toInstant());

文章作者: 👑Dee👑
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 👑Dee👑 !
  目录