常用操作合集七
写在前面
在工作中,我们可能会遇到一些问题,然后通过自己得一顿操作,最终把问题解决了。
可能在一两天之内,我们还是会记得解决这些问题的方法,但是过了一段时间之后,基本上都忘光了。
所以这里,我们应该要养成一个良好的习惯,把每次遇到的问题,如何解决的,都记录下。下次再看文档,这样就想起来了。
<<千与千寻>>有些事情是不可能忘记的,只是一时想不起来
下面,就分享一下,我遇到的一些问题,和相关的解决方法。
1.根据进程 PID 找到进程启动目录、二进制、日志位置等信息
#查找进程pid
ps -aux|grep jenkins
#进入到进程目录
cd /proc/2401 #(带上进程pid)
更多详情,可以参考这里:/proc/pid目录详解
2.定时写一个shell脚本,按日期切割nohup.out日志内容
#!/bin/bash
cd /opt/jxbp
# 设置切割文件的前缀和存放目录
NAME=$(basename $(basename "*.out") .out)
PREFIX="/opt/jxbp/*.out"
DATE=$(date +%Y%m%d)
OUTPUT_DIR="/opt/jxbp/log"
LOGFILE="${OUTPUT_DIR}/${NAME}-${DATE}.log"
# 检查目录是否存在,不存在则创建
mkdir -p "$OUTPUT_DIR"
# 将nohup.out的当前内容追加到新的日志文件中
tail -n +1 *.out >> "$LOGFILE"
# 清空.out文件
> ${NAME}.out
# (可选)如果你希望保留一定天数的日志,可以添加删除旧日志的逻辑
# 例如,保留最近7天的日志
find "$OUTPUT_DIR" -name "${NAME}-*.log" -type f -mtime +7 -delete
添加该shell脚本,到定时器任务中:
echo "*/1 * * * * /opt/llxydn/logback.sh" | crontab -
3.vue-devtools下载
4.mysql排序字段重复,导致分页出现重复数据问题
如果多行在 order by 列中具有相同的值,则服务器可以自由地以任何顺序返回这些行,并且可能会根据整体执行计划以不同的方式返回这些行。换句话说,这些行的排序顺序相对于无序列来说是不确定的。
例如:
--对age进行排序
select * from user order by age limit 0,10
--当age出现重复数据的时候,分页后,可能第1页出现的数据,会在第二页重复出现
select * from user order by age limit 10,10
解决方法:
- 方法一:给排序字段添加索引
create index user_age_idx on user(age);
- 方法二:在order by子句中加入具有唯一性的列
-- asc升序
select * from user order by age,id asc limit 0,10
-- desc降序
select * from user order by age desc ,id limit 0,10
id是自增字段
5.达梦数据库修改字段类型
-- 增加一个新字段
alter table FORM_CUSTOM_QUERY add SQL_1 clob;
-- 将旧字段的数据先更新到新字段中(注:如果你表中没数据,这步可以不用做)
update FORM_CUSTOM_QUERY set SQL_1 = SQL_;
-- 删除旧字段
alter table FORM_CUSTOM_QUERY drop column SQL_;
-- 将新字段改名为旧字段
alter table FORM_CUSTOM_QUERY rename column SQL_1 to SQL_;
6.统计公司网站(nginx)用户城市分布
使用到Maxmind的客户端库, libmaxminddb的github地址, 可以下载源码进行编译安装,用于读取Maxmind数据库文件,将ip解析出对应的地理位置,通过地理位置就可拿到城市等信息。
需要到Maxmind官网下载地理位置数据库文件,GeoLite2-City.mmdb
对nginx的日志文件access.log进行解析。
创建shell脚本文件: nginx_log_geoip.sh
#!/bin/bash
log_file="./access.log"
geoip_file="./GeoLite2-City.mmdb"
result_file="./result.log"
while read LINE; do
ip=$(echo $LINE | awk '{print $1}')
mmdblookup --file $geoip_file --ip "$ip" city names zh-cN 2>/dev/null
| awk -F'"' '{print $2}' >> $result_file
done < $log file
grep -Ev "^$" $result_file | sort | uniq -c | sort -k1 -nr
该shell脚本解析如下:
log_file为 nginx日志文件路径
geoip_file为 Maxmind的地理位置对应城市的数据库文件
result_file为 输出结果文件
while,循环遍历nginx日志文件每一行,进客户端ip提取出来,使用mmdblookup获得ip对应的城市,输出到结果文件
grep,使用grep过滤出非空行的城市,通过sort进行排序,通过uniq -c去重统计次数,再用sort k1对于次数做一个排序
nginx对应访问日志格式如下:
7.基于nginx实现灰度上线系统
- 1.基于权重的流量切分
nginx将用户流量按比例转发到新版本,一旦新版本验证通过,再将流量切换到新版本。
使用upstream配置权重即可。
upstream webservers{
server 192.168.0.1 weight=9;
server 192.168.0.2 weight=1;
}
- 2.基于客户端请求的流量切分
nginx通过获取客户端携带的cookie或者http请求头或者指定的键值对,来去将流量转发到新版本,一旦新版本验证通过,再将流量切换到新版本。 2.基于客户端请求的流量切分
nginx通过获取客户端携带的cookie或者http请求头或者指定的键值对,来去将流量转发到新版本,一旦新版本验证通过,再将流量切换到新版本。
set $backend "webservers"
#当客户端携带的cookie,包含canary=yes键值对,将backend设置为灰度版本
if($http_cookie ~* "canary=yes"){
set $backend "webservers-canary"
}
location / {
proxy_pass http://$backend; #这里使用动态值
}
8.如何提升Springboot的启动速度?
- 1.延迟初始化
使用延迟初始化方式,让bean在被真正使用的时候,才进行初始化。
可以在application.yml加上下面的配置:
spring:
main:
lazy-initialization: true
将
spring.main.lazy-initialization
的值更改为true
,默认为false
- 2.使用Spring Context Indexer功能
使类扫描时,避免类过多而导致扫描速度过慢问题
在pom.xml依赖中,加上下面的依赖:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-indexer</artifactId>
<version>5.1.12.RELEASE</version>
<optional>true</optional>
</dependency>
</dependencies>
然后在启动类加上@Indexed
注解,当程序编译打包时,会自动生成META-INT/spring.components文件。
当Spring应用上下文执行ComponentScan扫描时,META-INT/spring.components将会被CandidateComponentsIndexLoader 读取并加载,转换为CandidateComponentsIndex对象,这样的话@ComponentScan不在扫描指定的package,而是读取CandidateComponentsIndex对象,从而达到提升性能的目的。
- 3.可以通过关闭JMX,来提升速度
JMX是Java平台的管理和监控标准,一些情况下我们希望禁用JMX以确保应用程序的安全性或避免性能问题,如果我们不需要这些监控,可以手动关闭JMX。
可以在application.yml加上下面的配置:
spring:
jmx:
enabled: false
好了,以上就是我个人的实操了。可能有些不对,大家伙,轻点喷!!!
个人理解,可能也不够全面,班门弄斧了。
好了,今天就先到这里了!!!^_^
如果觉得有收获的,帮忙点赞、评论、收藏
一下,再走呗!!!
转载自:https://juejin.cn/post/7375083022612480034