Linux统计文件夹、文件数量的命令

查看当前目录下的文件数量(不包含子目录中的文件)

ls -l|grep "^-"| wc -l

查看当前目录下的文件数量(包含子目录中的文件) 注意:R,代表子目录

ls -lR|grep "^-"| wc -l

查看当前目录下的文件夹目录个数(不包含子目录中的目录),同上述理,如果需要查看子目录的,加上R

ls -l|grep "^d"| wc -l

查询当前路径下的指定前缀名的目录下的所有文件数量

例如:统计所有以“20161124”开头的目录下的全部文件数量

ls -lR 20161124*/|grep "^-"| wc -l

  

对每个命令参数做一下说明备注:

ls -l
该命令表示以长列表输出指定目录下的信息(未指定则表示当前目录),R代表子目录中的“文件”,这个“文件”指的是目录、链接、设备文件等的总称

grep "^d"表示目录,"^-"表示文件

wc -l
表示统计输出信息的行数,因为经过前面的过滤已经只剩下普通文件,一个目录或文件对应一行,所以统计的信息的行数也就是目录或文件的个数

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 看一下了。

树莓派使用 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

Ubuntu 安装配置 supervisor

背景交代:

  一台 Job queue 服务器,Ubuntu 18.04, 上面跑着 Beanstalkd 服务 + PHP 7.2 环境,运行着几个 php 的命令行脚本,作为 consumer 去消费任务,一直以 nohup & 的方式去运行,实践证明,这种方式并不可靠,脚本还是会死掉,那就上 supervisor 保平安吧。
  Supervisor (http://supervisord.org) 是一个用 Python 写的进程管理工具,假如你有一个进程需要每时每刻不断的跑,但是这个进程又有可能由于各种原因有可能中断。当进程中断的时候我希望能自动重新启动它,这就是 supervisor 做的事情。

安装步骤

Ubuntu 安装:直接用 apt 方式安装,简单省事,开机自启动都自动配好了。

sudo apt-get install supervisor

CentOS 安装

yum install supervisor -y
/etc/supervisord.d/*.ini    配置文件
安装之后一般都改为 *.conf 

查看版本号:

supervisord -v
3.3.1

Config

/* 主配置文件 */
/etc/supervisor/supervisord.conf

/* 子配置文件 */
/etc/supervisor/conf.d/*.conf

新建配置文件,建议每个任务一个独立的配置文件

cd /etc/supervisor/conf.d
vim googlehome_subscribe.conf

配置文件内容

[program:googlehome_subscribe]
directory               = /www/wwwroot/google-home/subscribe-miot ; 程序的启动目录
command                 = php googlehome_subscribe.php    ; 启动命令
numprocs                = 1                   ; 启动几个进程
autostart               = true                ; 在 supervisord 启动的时候也自动启动
startsecs               = 5                   ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart             = true                ; 程序异常退出后自动重启
startretries            = 3                   ; 启动失败自动重试次数,默认是 3
user                    = root                ; 用哪个用户启动
redirect_stderr         = true                ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB                ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups  = 20                  ; stdout 日志文件备份数
stdout_logfile          = /www/wwwlogs/googlehome_subscribe.log

多进程启动

当 numprocs=1 时, process_name=%(program_name)s
当 numprocs>=2 时, process_name=%(program_name)s_%(process_num)
[program:googlehome_subscribe]
directory               = /www/wwwroot/google-home/subscribe-miot ; 程序的启动目录
command                 = php googlehome_subscribe.php    ; 启动命令
process_name            = %(program_name)s_%(process_num)
numprocs                = 2                   ; 启动几个进程
autostart               = true                ; 在 supervisord 启动的时候也自动启动
startsecs               = 5                   ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart             = true                ; 程序异常退出后自动重启
startretries            = 3                   ; 启动失败自动重试次数,默认是 3
user                    = root                ; 用哪个用户启动
redirect_stderr         = true                ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB                ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups  = 20                  ; stdout 日志文件备份数
stdout_logfile          = /www/wwwlogs/googlehome_subscribe.log

使用 supervisorctl 常用命令

supervisorctl 是 supervisord 的一个命令行客户端工具,可以通过它去执行一些命令。

# 查看进程状态 #
supervisorctl status

# 启动,停止,重启 所有进程 #
supervisorctl start all
supervisorctl stop all
supervisorctl restart all

# 启动某个进程(program_name=你配置中写的程序名称) #
supervisorctl start program_name

# 多进程重启 #
# 缺点:多个进程需要多次启动,这种比较平滑,可以写个 shell 去循环 restart #
supervisorctl restart program_name:program_name_0
supervisorctl restart program_name:program_name_1

# 这种通配符会同时重启所有进程,先 stop 所有,再 start 所有,不够平滑 #
supervisorctl restart program_name:*

# 更新配置,平滑启动 适用于:修改配置或新增配置 #
supervisorctl reread
supervisorctl update

# 重启所有进程 #
supervisorctl reload

报错整理

error: <class 'socket.error'>, [Errno 2] No such file or directory: file: /usr/lib64/python2.7/socket.py line: 224

# 解决方案 #
supervisord
supervisorctl reread
supervisorctl update

Check

配置文件改好之后 reload 就可以了,ps -aux | grep googlehome_subscribe 看一下有脚本启动就说明配置成功了。

更多用法参考文档:http://supervisord.org/