命令

find $path -name/-iname $patten [-print] -exec rm -rf {} \;

详解

  • find 查找文件
  • $path 查找的路径
  • -name/-iname 根据文件名查找,-iname 不区分大小写
  • $patten 文件名格式
  • [-print] 打印查找到的文件,可选参数
  • -exec 查找后执行命令
  • rm -rf 删除文件,-rf 强制删除非空文件夹
  • {} 代表查找到的文件
  • \; ; 是结束符,\ 是转义符

阅读更多

在实际生产环境中,避免不了有很多后台运行的任务和定时任务,对任务状态的监控与及时告警可以尽量减少程序出错时对用户造成的影响。针对常见的两种任务类型:定时任务、守护进程内批处理任务,利用 Node.js child_process 实现了任务状态的监控、重启与邮件告警。

思路

现在的互联网已经不是单机作战的时代了,分布式部署是非常常见的方式,一个项目中的任务可能运行在多台服务器上,我们的监控平台要做到重启某个任务就需要知道任务运行的具体服务器,针对这一个问题我们需要获取到任务与服务器关系的确切信息,所以每台运行任务的服务器需要在启动任务时向任务状态管理平台注册自己的信息。

任务状态的维护依赖于任务运行服务器的心跳上报,每个任务设置一个超时时间,在任务启动时向任务状态管理平台发送开始运行信号,在任务运行结束后向管理平台发送运行完成信号。任务管理平台根据任务设置的超时时间,在超时后仍然没有接收到任务完成信号则判定任务失败,将任务失败信号发送回任务运行的服务器。再有任务运行服务器自行处理,如重启任务或者结束任务等。

阅读更多

所有支持的信号

kill -l

1
2
3
4
5
6
7
8
9
10
11
12
13
 1) SIGHUP        2) SIGINT        3) SIGQUIT        4) SIGILL        5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

阅读更多

还是老方法,依旧使用 chnroutes 生成路由表。并且非常不优雅,但是在找不到解决方案的时候可以暂时解决问题。

在使用 PPTP 方式连接 VPN 的时代,只要将生成的 ip-upip-down 拷贝到 /etc/ppp 目录下并且 sudo chmod +x ip-up ip-down 赋予执行权限,在连接 VPN 时会自动调用 ip-up 添加静态路由,在断开 VPN 时会自动调用 ip-down 删除静态路由。

阅读更多

生产者

添加任务时将 value 设置为任务名称并携带序列化的参数 name@params, score 设置为任务开始执行的时间戳。在每次加入任务时首先判断任务是否已经存在,如果存在跳过处理,如果不存在将任务加入任务池。

阅读更多

需求:功能 A 需要调用第三方 API 获取数据,而第三方 API 自身是异步处理方式,在调用后会返回数据与状态 { data: "查询结果", "status": "正在异步处理中" },这样就需要间隔一段时间后再去调用第三方 API 获取数据。为了用户在使用功能 A 时不会因为第三方 API 正在异步处理中而必须等待,将用户请求加入任务队列中,返回部分数据并关闭请求。然后定时从任务队列里中取出任务调用第三方 API,若返回状态为”异步处理中“,将该任务再次加入任务队列,若返回状态为”已处理完毕“,将返回数据入库。

根据以上问题,想到使用 Node.js + Redis sorted set 来实现任务队列。Node.js 实现自身应用 API 用来接受用户请求,合并数据库已存数据与 API 返回的部分数据返回给用户,并将任务加入到任务队列中。利用 Node.js child process 与 cron 定时从任务队列中取出任务执行。

阅读更多

在配置 Kubernetes 的过程中需要自己配置开机启动服务,有些文章中[Service]部分引入配置文件写EnvironmentFile=/path/of/config/file,而有些文件写Environment=-/path/of/config/file。仅仅一个-的差别让人困惑了好久,终于在 Fedora 的文档中发现了这样一段话,解决了困惑。

阅读更多

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
26
27
28
29
30
31
32
33
# -*- coding: utf-8 -*-

def merge(array, start, middle, end):
n1 = middle - start + 1 # 第一个子序列长度
n2 = end - middle # 第二个子序列长度
left_array = []
right_array = []
for i in range(n1):
left_array.append(array[start + i])
for i in range(n2):
right_array.append(array[middle + i + 1])
left_array.append(float('Inf')) # float('Inf') 表示正无穷
right_array.append(float('Inf'))
i = j = 0
for index in range(start, end + 1):
if (left_array[i] <= right_array[j]):
array[index] = left_array[i]
i += 1
else:
array[index] = right_array[j]
j += 1
return array

def merge_sort(array, start, end):
if start < end:
middle = (start + end) // 2
merge_sort(array, start, middle)
merge_sort(array, middle + 1, end)
merge(array, start, middle, end)

array = [1, 9, 2, 6, 7, 8, 8, 7, 9, 11, 18, 12, 13]
merge_sort(array, 0, len(array) - 1)
print(array)
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×