日常编程开发技巧之二

Centos 7 卸载系统自带的 NodeJs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看已安装的npm
# rpm -qa|grep npm

# 查看已安装的nodejs
# rpm -qa|grep nodejs

# 卸载
# yum -y remove nodejs npm

# 删除残留文件
# rm -rf ~/.npm
# rm -rf ~/.npmrc
# rm -f /usr/bin/npm
# rm -f /usr/bin/node
# rm -rf /usr/lib/node_modules

Linux 批量替换文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
# 命令格式:sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`

# 为了不区分大小写匹配搜索,可以使用 I 参数
$ sed 's/unix/linux/gI' sed-test.txt

# 将当前目录下所有文件中的字符串oldstring替换为newstring
$ sed -i "s/oldstring/newstring/g" `ls`

# 查找当前目录下所有后缀为md的文件,并将文件中的字符串oldstring替换为newstring
$ sed -i "s/oldstring/newstring/g" `find . -name "*.md"`

# 当搜索和替换含分隔符的字符串时,需要用反斜杠 \ 来取消转义
$ sed "s/\/bin\/bash/\/usr\/bin\/fish/g" sed-test.txt

Linux 删除文件中的某行内容

1
2
3
4
5
# 删除文件中的某行内容
$ sed -i '/hello/d' abc.txt

# 查找当前目录下所有后缀为txt的文件,并批量删除文件中的某行内容
$ find . -type f -iname "*.txt" | xargs -I {} sed -i '/hello/d' {}

Linux 批量替换文件名中的字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 假设原文件名是“stu_102999_5_finished.jpg”,需要替换字符串"_finished"为""空字符串

# 方法一:使用rename改名(支持中文特殊字符的替换)
$ rename "_finished" "" *.jpg

# 使用rename批量改名
$ find . -name "*.avi" | xargs -I {} rename "xxx" "" {}

# 方法二:for循环结合sed替换
$ for file in `ls *.jpg`;do mv $file `echo $file|sed 's/_finished//g'`;done;

# 方法三:for循环加变量部分截取
$ for file in `ls *.jpg`;do mv $file `echo ${file%_finished*}.jpg`;done;

# 方法四:ls结合awk,输出交给bash执行
$ ls *.jpg |awk -F "_finished" '{print "mv "$0" "$1$2""}'|bash

Linux 搜索文件里面的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 在单个文件中搜索内容,区分大小写
$ grep 'keyword' filename

# 在单个文件中搜索内容,忽略区分大小写
$ grep -i 'keyword' filename

# 在多个文件中搜索内容,忽略区分大小写
$ grep -i 'keyword' filename1 filename2 filename3

# 搜索一个目录下所有文件里面的内容,忽略区分大小写
$ find . -type f -name "*" | xargs grep -i "keyword"

# 搜索一个目录下后缀为 .properties 的文件里面的内容,忽略区分大小写
$ find . -type f -name "*.properties" | xargs grep -i "keyword"

FFmpeg 常用命令

1
2
3
4
5
# 将flv格式的视频转换为mp4格式
$ ffmpeg -i xxxxx.flv xxxxx.mp4

# 按时间戳截取视频片段
$ ffmpeg -i ./SN.mp4 -vcodec copy -acodec copy -ss 00:00:00 -to 00:00:05 ./cutout1.mp4 -y

Hexo 创建草稿

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建草稿,默认会在source/_drafts目录下生成first-draft.md文件
$ hexo new draft "first-draft"

# 提示:草稿不会被显示在任何页面上,链接也访问不到,也就是说如果想把某一篇文章移除显示,又不舍得删除,可以尝试把它移动到source/_drafts目录之中

# 如果希望强行预览草稿,可以更改_config.yml配置文件中的以下参数
render_drafts: true

# 或者,使用如下方式启动server后预览草稿
$ hexo server --drafts

# 将草稿转成正式文章
$ hexo publish "first-draft"

Linux 压缩 Jpeg 图片

1
2
3
4
5
6
7
8
9
10
11
# 安装软件
# yum install -y jpegoptim

# 指定图片压缩后的大小
$ jpegoptim --size=520k pic.jpeg

# 指定图片压缩质量
$ jpegoptim -m80 pic.jpg --dest pic-2.jpg

# 批量压缩图片
$ find . -name "*.jpg" | xargs jpegoptim

Linux 压缩 Png 图片

1
2
3
4
5
# 安装软件
# yum install -y optipng

# 压缩图片
$ optipng pic.png -out pic-2.png

https://github.com/bugwhine/lookbusy

卸载 UrBackup 服务

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
# 提示:UrBackup的服务之前是通过手动编译的方式来安装

# 查找UrBackup的自启动服务
# systemctl list-unit-files --type=service | grep enabled | grep urbackup

# 停止UrBackup的自启动服务
# systemctl stop urbackup-server.service
# systemctl disable urbackup-server.service

# 删除UrBackup的日志文件
# rm -rf /var/log/urbackup.log

# 删除UrBackup的安装文件
# rm -rf /usr/local/var/urbackup
# rm -rf /usr/local/share/urbackup
# rm -rf /usr/local/bin/urbackupsrv

# 删除UrBackup的配置文件
# rm -rf /etc/default/urbackupsrv
# rm -rf /etc/logrotate.d/urbackupsrv
# rm -rf /etc/systemd/system/urbackup-server.service

# 查漏补缺,将搜索到的文件全部删除掉
# find / -type d -iname 'urbackup'
# find / -type f -iname 'urbackupsrv'

Github 搜索技巧

Github 官方的搜索语法介绍,常用搜索示例如下,当同时使用多个搜索参数时,使用” 空格” 符隔开不同的参数

  • in:name spring // 搜索名字中带有”spring” 的项目
  • in:readme spring // 搜索 readme 中带有”spring” 的项目
  • in:description spring // 搜索描述中带有”spring” 的项目
  • stars:>1000 // 搜索 stars>1000 的项目
  • forks:>1000 // 搜索 forks>1000 的项目
  • pushed:>2020-01-15 // 搜索最近更新于 2020 年 1 月 15 日之后的项目
  • language:Python // 搜索 Python 的项目

Linux 查看硬盘转数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 下载sg3_utils工具的压缩包,官网地址:http://sg.danny.cz/sg/sg3_utils.html
# wget http://sg.danny.cz/sg/p/sg3_utils-1.45.tar.xz

# 解压文件
# tar -xvf sg3_utils-1.45.tar.xz

# 进入解压目录
# cd sg3_utils-1.45

# 编译安装
# ./configure
# make && make install

# 查看硬盘转数
$ sg_vpd --page=0xb1 /dev/sde
Nominal rotation rate: 7200 rpm
Nominal form factor: 3.5 inch

Linux 使用 Sysbench 进行压测

常用的压测工具:ab、stress、sysbench、webbench、jmeter。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 压测CPU性能(单核、四核、八核)
$ sysbench --test=cpu --num-threads=1 --max-requests=10000 run
$ sysbench --test=cpu --num-threads=4 --max-requests=100000 run
$ sysbench --test=cpu --num-threads=8 --max-requests=100000 run

# 压测CPU性能(单核、四核、八核),cpu-max-prime 是素数生成数量的上限,threads 是线程数,time 是运行的时间(秒),event 是达到上限的次数(默认值为0,表示不限制上限次数)
$ sysbench cpu --cpu-max-prime=20000 --threads=1 --time=10 run
$ sysbench cpu --cpu-max-prime=20000 --threads=4 --time=10 run
$ sysbench cpu --cpu-max-prime=20000 --threads=8 --time=10 run

# 压测内存性能(随机读写、连续读写)
$ sysbench --test=memory --memory-block-size=1K --memory-total-size=1G --memory-access-mode=rnd run
$ sysbench --test=memory --memory-block-size=1K --memory-total-size=1G --memory-access-mode=seq run

# 压测八线程的共享线程锁
$ sysbench --test=threads --num-threads=1000 --thread-yields=1000 --thread-locks=8 run

# 压测互斥锁
$ sysbench --test=mutex --mutex-num=4096 --mutex-locks=50000 --mutex-loops=10000 run

# 压测磁盘IO(随机读写、连续读写)
$ sysbench --test=fileio --file-num=2 --file-total-size=64M --file-test-mode=rndwr run
$ sysbench --test=fileio --file-num=2 --file-total-size=64M --file-test-mode=seqrewr run

CRT 格式证书转为 PEM 格式证书

1
$ openssl x509 -in example.com.crt -out example.com.pem -outform PEM

系统端口号冲突排查

1
2
3
4
5
6
# 查看当前系统各服务占用的端口号
# netstat -lntup

# 查看占用8080端口的服务
# netstat -anp|grep 8080
# netstat -aon|grep 8080

Centos 6、7 的服务类相关命令

  • Centos 6

    • 注册在系统中的标准化程序
    • 统一的管理方式(常用方法)
      • service 服务名 start
      • service 服务名 stop
      • service 服务名 restart
      • service 服务名 status
    • 查看服务的方法: /etc/init.d/服务名
    • 通过 chkconfig 命令管理服务自启动
      • 查看自启动的服务: chkconfig --list|grep xxx
      • 启用服务自启动: chkconfig --level 5 服务名 on
      • 关闭服务自启动: chkconfig --level 5 服务名 off
  • Centos 7

    • 注册在系统中的标准化程序
    • 统一的管理方式(常用方法)
      • systemctl start 服务名(xxx.service)
      • systemctl stop 服务名(xxx.service)
      • systemctl restart 服务名(xxx.service)
      • systemctl reload 服务名(xxx.service)
      • systemctl status 服务名(xxx.service)
    • 查看服务的方法: /usr/lib/systemd/system/服务名
    • 查看服务的命令
      • systemctl list-unit-files | grep service_name
      • systemctl --type service | grep service_name
    • 通过 systemctl 命令管理服务自启动
      • 启用服务自启动: systemctl enable service_name
      • 关闭服务自启动: systemctl disable service_name

Centos7 管理不同版本的 JDK

/etc/alternatives/ 目录存放着系统默认命令的链接符,而 update-alternatives 是 Linux 系统中专门维护系统命令链接符的工具,通过它可以很方便地设置系统默认使用哪个命令、哪个软件版本。例如,在系统中同时安装了 Open JDK 和 Oracle JDK(两者都通过 RPM 包安装),而实际又希望系统默认使用的是 Oracle JDK,此时就可以通过 update-alternatives 很方便地实现。当执行以下命令后,根据输出的提示信息,直接输入希望被系统默认使用的选项的编号即可;命令执行完后,可以看到 /etc/alternatives/ 目录下 Java 相关的链接符发生了改变。

1
2
3
4
5
6
7
8
9
10
11
# update-alternatives --config java

共有 3 个提供“java”的程序。

选项 命令
-----------------------------------------------
1 /usr/java/jdk1.8.0_102/jre/bin/java
2 java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-1.el7_9.x86_64/jre/bin/java)
*+ 3 /usr/java/jdk-11.0.9/bin/java

按 Enter 保留当前选项[+],或者键入选项编号:

特别注意的是,如果 JDK 是通过解压的方式来安装的(非 RPM 包安装),那么就只能通过手动配置系统的 JDK 环境变量来替代 update-alternatives 命令的功能,具体可以参考以下配置:

1
2
3
4
5
6
7
8
9
10
# 编辑配置文件,添加对应的JDK环境变量
# vim /etc/profile
JAVA_HOME=/usr/java/jdk1.8.0_102
JRE_HOME=/usr/java/jdk1.8.0_102/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH

# 使配置文件生效
# source /etc/profile

Markdown 折叠代码语法

  • code:指定代码块
  • details:折叠语法标签
  • summary:折叠语法展示的摘要
  • pre:以原有格式显示元素内的文字是已经格式化的文本

markdown-code-fold

Centos7 清除命令历史记录、登录信息

1
2
3
4
5
6
# 清除命令历史记录
$ echo > .bash_history
$ history -cw

# 验证清除效果
$ history
1
2
3
4
5
6
7
8
# 清除登录信息
$ sudo sh -c 'echo > /var/log/wtmp'
$ sudo sh -c 'echo > /var/log/btmp'
$ sudo sh -c 'echo > /var/log/lastlog'
$ sudo sh -c 'echo > /var/log/secure'

# 验证清除效果
$ last

配置阿里巴巴的 DNS 服务

域名系统(服务)协议(DNS)是一种分布式网络目录服务,主要用于域名与 IP 地址的相互转换,以及控制因特网的电子邮件的发送。在 Linux 服务器上快速配置阿里巴巴 DNS 服务的方法如下:

1
2
3
4
5
6
7
8
# 编辑系统配置文件,只需要添加以下两行内容
# vim /etc/resolv.conf

nameserver 223.5.5.5
nameserver 223.6.6.6

# 重启网络服务
# service network restart

模拟 CPU 高负载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 下载
# wget http://www.devin.com/lookbusy/download/lookbusy-1.4.tar.gz

# 解压
# tar -xvf lookbusy-1.4.tar.gz

# 进入解压目录
# cd lookbusy-1.4

# 预配置
# ./configure

# 编译
# make -j4

# 安装
# make install
  • Lookbusy 的使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 让所有CPU核心的使用率都是30%
$ lookbusy -c 30

# 让两个CPU核心的使用率为30%
$ lookbusy -n 2 -c 30

# 让所有CPU核心的使用率在60%-70%上下浮动
$ lookbusy -c 60-70 -r curve

# 让所有CPU核心的使用率在20%-80%之间,周期为24小时,在14点达到峰值
$ lookbusy --cpu-mode curve --cpu-curve-peak 14h -c 20-80

# 让所有CPU核心的使用率在20%-30%之间,周期为60分钟,在30分钟达到峰值
$ lookbusy --cpu-mode curve --cpu-curve-period 60m --cpu-curve-peak 30m -c 20-30

Debian/Ubuntu 安装 GCC 与 G++

build-essential 是 C/C++ 的开发包,包含了 gccg++makegdblibc 等工具,执行下面的命令安装即可:

1
# apt-get -y install build-essential

Centos7 更改内核启动顺序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看当前系统有几个内核
# cat /boot/grub2/grub.cfg |grep menuentry

# 查看当前系统的默认内核
# grub2-editenv list

# 更改系统默认的启动内核
# grub2-set-default 'CentOS Linux (3.10.0-514.26.2.el7.x86_64) 7 (Core)'

# 重启系统生效
# reboot

# 重启后查看内核是否已经修改
# uname -a

Centos7 设置静态 IP

  • 查看网络接口列表
1
# ip addr
  • 编辑网络接口 enp0s3 的配置文件,为 enp0s3 网络接口设置静态 IP 192.168.2.221
1
2
# 编辑配置文件,添加以下内容
# sudo vim /etc/sysconfig/network-scripts/ifcfg-enp0s3
1
2
3
4
5
6
BOOTPROTO=static
DNBOOT=yes
IPADDR=192.168.2.221
NETMASK=255.255.255.0
GATEWAY=192.168.2.1
DNS1=8.8.8.8
  • 重启网络服务
1
# systemctl restart network
  • 测试网络服务
1
$ ping www.baidu.com

查找大目录

  • 查找某个目录下的大目录,并且只查找一级目录,按照从大到小的顺序显示。
1
du -h --max-depth=1 /path/to/directory | sort -rh

拷贝文件夹,并忽略某个子文件夹

  • 方法一:使用 rsync 命令,递归拷贝源目录中的所有文件和子目录,包括隐藏文件和目录,除了明确排除的某些文件或目录
1
rsync -av --exclude='subdir_to_ignore' source_dir/ target_dir/
  • 方法二:使用 findcp 命令,递归拷贝源目录中的所有文件和子目录,并忽略指定的子文件夹
1
find source_dir -path 'source_dir/subdir_to_ignore' -prune -o -print | cpio -pdm target_dir