Linux Shell脚本实现根据进程名杀死进程

起因

  为什么会写这篇文章呢,先说一下背景,因为一个生产环境的机器内存占用一直很高,经过排查发现是一个 consumer 的消费脚本中并发 http client 没有 close,导致定时每小时跑完的脚本一直在那里放着占用内存,时间久了内存占用就上来了,很快我就上了个 patch 修复了这个问题,但是那些跑完的脚本怎么处理呢?还用说嘛,当然要 kill 掉了。

脚本

手动每个去 kill 那真是太慢了,直接找个批量处理的脚本,将以下内容保存为 kill.sh,赋予执行权限,传入脚本的名称即可批量 kill 掉。

./kill.sh procedure_name
#!/bin/sh

if [ $# -lt 1 ]
then
  echo "缺少参数:procedure_name"
  exit 1
fi

PROCESS=`ps -ef|grep $1|grep -v grep|grep -v PPID|awk '{ print $2}'`
for i in $PROCESS
do
  echo "Kill the $1 process [ $i ]"
  kill -9 $i
done

一句话命令

感觉上面的脚本麻烦,可以直接使用下面的一句来实现。

ps -ef | grep procedure_name | grep -v grep | awk '{print $2}' | xargs kill -9

总结

杀掉脚本之后,内存立刻恢复正常占用,顿时感觉清爽了许多。

  1. 保证良好的编码习惯,一些资源用过之后及时 close。
  2. 定期查看生产环境的各种 logs,查找资料并解决报错,技术积累大部分来源于解决生产环境问题。

Linux 创建 swap 交换分区

起因

  日常巡视机器的时候发现一台 4G memory 占用有 3.3G,free 120+M,原来是脚本跑的太多了,导致内存占用上去了,free -h 看了一下这个机器没有 swap 分区,现在记录一下创建过程。

准备工作

查看当前系统Swap信息,如果没有 swap 分区将没有回显。

swapon
swapon -s

也可以使用 free 命令来查看当前系统是否存在 Swap 交换分区

free -h

记得检查磁盘空间是否充足

df -h

步骤

  一般情况下,我们都会使用 dd 命令来预先创建交换分区文件,然后再用 /dev/zero 将该文件的内容全部置零,创建时还将用到 bs 参数来设置要创建的交换空间大小,以及使用 count 来指定要创建的 block 数。
注意:/www/swap 是我指定的路径,这个可随意设定。

1. 开始创建 1GB 大小的交换分区:

dd if=/dev/zero of=/www/swap bs=1M count=1024

2. 初始化为交换分区文件:

mkswap /www/swap

3. 启用交换分区文件:

swapon /www/swap

4. 使系统开机时自启用,在文件 /etc/fstab 中添加一行:

/www/swap    swap    swap    defaults    0 0

到这里已经创建成功了,可以 free -h 看一下了。

IDEA 创建 Spring Boot 笔记

前言

  Java 技术栈也是从 2018 年开始接触不久,今天整理了一下年前的笔记,写一篇博文来记录一下从 0 开始搭建 Spring Boot 的步骤。

准备

  1. 首先安装好 JDK
  2. 安装好 Intellij IDEA

步骤

1. 在 IDEA 左上角点击 File -> New -> Project 。

2. 点击 Spring Initializr,确保 Project SDK 读取到你想要的版本,Next 。

3. 修改 Group、Artifact 为你的项目信息,Next 。

4. 点击 Web,勾选 Web,Spring Boot 版本显示 2.1.2,默认这个就是稳定版,直接用就可以,Next。

5. 设置 Project name + Project location,一般无需设置,点击 Finish,开始更新 Maven dependencies,几分钟就可以更新完毕。

总结

  创建过程还是很简单的,IDEA 的功能用起来也是很牛逼,还有更多的功能待我去研究。

树莓派使用 PPTP 客户端连接 VPN

安装

sudo apt-get install -y pptp-linux

配置

sudo vim /etc/ppp/peers/pptpconf

// 添加如下内容:(自行更改IP, name, password)
pty "pptp xxx.xxx.xxx.xxx --nolaunchpppd"
name xxx
password xxx
remotename PPTP
require-mppe-128
require-mschap-v2
refuse-eap
refuse-pap
refuse-chap
refuse-mschap
noauth
persist
maxfail 0
defaultroute
replacedefaultroute
usepeerdns

启动 & 关闭

pptp 客户端操作: 
启动:pon pptpconf 
关闭:poff pptpconf

Redis 导出导入 hash 结构

导出 Redis hash 数据

方法一: 需要自己再二次处理为 reids 命令格式

echo "HGETALL miot:did:type" | redis-cli -h localhost -p 6379 >> type.raw

方法二: 导出 redis 命令格式,注意最后一行有可能输出执行时间,如果有时间就删除最后一行即可

echo "HGETALL miot:did:type" | redis-cli -h localhost -p 6379 | xargs -n 2 |awk -F" " -v KEYNAME=miot:did:type '{print "HSET "KEYNAME " " $1, "\""$2"\""}' >> type.raw

方法三: 利用 phpRedisAdmin 导出 Redis 命令格式,然后从网页端复制到文件保存

导入 Redis

  导入就简单了,将 Redis 命令文件 cat 出来,通过管道传过去即可。

cat type.raw | redis-cli -h localhost -p 6379 --pipe