Linux
2015-01-17
信号
信号可以被捕获,或者被忽略,除了 9 KILL 和 19 STOP。
信号值
Ubuntu:
$ kill -l
HUP INT QUIT ILL TRAP IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS
$ type kill
kill is a shell builtin
$ /usr/bin/kill -L
1 HUP 2 INT 3 QUIT 4 ILL 5 TRAP 6 ABRT 7 BUS
8 FPE 9 KILL 10 USR1 11 SEGV 12 USR2 13 PIPE 14 ALRM
15 TERM 16 STKFLT 17 CHLD 18 CONT 19 STOP 20 TSTP 21 TTIN
22 TTOU 23 URG 24 XCPU 25 XFSZ 26 VTALRM 27 PROF 28 WINCH
29 POLL 30 PWR 31 SYS
CentOS:
$ kill -l
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
HUP
终端关闭
INT
Ctrl + C
QUIT
终端退出 Ctrl + 4 or \
ILL
TRAP
IOT
/ABRT
BUS
FPE
KILL
常来自 kill -9
USR1
SEGV
USR2
PIPE
ALRM
TERM
STKFLT
CHLD
子进程终止
CONT
STOP
TSTP
终端挂起 Ctrl + Z
TTIN
TTOU
URG
XCPU
XFSZ
VTALRM
PROF
WINCH
终端窗口大小改变
POLL
PWR
SYS
由于 9 KILL 不能被捕获,设计软件时可以捕获 15 TERM, 进行清理操作,然后需要杀进程时,先尝试 kill -15
。
附: 信号表(来自 man 7 signal
)
Signal |
x86/ARM most others |
Alpha/ SPARC |
MIPS |
PARISC |
Notes |
SIGHUP |
1 |
1 |
1 |
1 |
|
SIGINT |
2 |
2 |
2 |
2 |
|
SIGQUIT |
3 |
3 |
3 |
3 |
|
SIGILL |
4 |
4 |
4 |
4 |
|
SIGTRAP |
5 |
5 |
5 |
5 |
|
SIGABRT |
6 |
6 |
6 |
6 |
|
SIGIOT |
6 |
6 |
6 |
6 |
|
SIGBUS |
7 |
10 |
10 |
10 |
|
SIGEMT |
- |
7 |
7 |
- |
|
SIGFPE |
8 |
8 |
8 |
8 |
|
SIGKILL |
9 |
9 |
9 |
9 |
|
SIGUSR1 |
10 |
30 |
16 |
16 |
|
SIGSEGV |
11 |
11 |
11 |
11 |
|
SIGUSR2 |
12 |
31 |
17 |
17 |
|
SIGPIPE |
13 |
13 |
13 |
13 |
|
SIGALRM |
14 |
14 |
14 |
14 |
|
SIGTERM |
15 |
15 |
15 |
15 |
|
SIGSTKFLT |
16 |
- |
- |
7 |
|
SIGCHLD |
17 |
20 |
18 |
18 |
|
SIGCLD |
- |
- |
18 |
- |
|
SIGCONT |
18 |
19 |
25 |
26 |
|
SIGSTOP |
19 |
17 |
23 |
24 |
|
SIGTSTP |
20 |
18 |
24 |
25 |
|
SIGTTIN |
21 |
21 |
26 |
27 |
|
SIGTTOU |
22 |
22 |
27 |
28 |
|
SIGURG |
23 |
16 |
21 |
29 |
|
SIGXCPU |
24 |
24 |
30 |
12 |
|
SIGXFSZ |
25 |
25 |
31 |
30 |
|
SIGVTALRM |
26 |
26 |
28 |
20 |
|
SIGPROF |
27 |
27 |
29 |
21 |
|
SIGWINCH |
28 |
28 |
20 |
23 |
|
SIGIO |
29 |
23 |
22 |
22 |
|
SIGPOLL |
|
|
|
|
Same as SIGIO |
SIGPWR |
30 |
29/- |
19 |
19 |
|
SIGINFO |
- |
29/- |
- |
- |
|
SIGLOST |
- |
-/29 |
- |
- |
|
SIGSYS |
31 |
12 |
12 |
31 |
|
SIGUNUSED |
31 |
- |
- |
31 |
|
WebDev Apache
2015-01-04
2.2 版本下的权限控制语句在 2.4 下已经不再适用,需要做一些调整。
Order deny,allow
Deny from all
应该改成:Require all denied
Order deny,allow
Deny from all
Allow from example.com
应该改成:Require host example.com
Order allow,deny
Allow from all
应该改成:Require all granted
嗯,挺好,新语法更加简单。
Linux
2015-01-03
Linux 文件的三种时间:
atime
访问时间 Access
ctime
修改时间 Change, 文件状态变化
mtime
修改时间 Modify, 文件内容变化
注意:如果 chmod,chown,mv 等不改变文件内容的操作,ctime 变化,mtime 不变。
但是文件内容变化的时候,ctime 和 mtime 都会变化,文件大小没有变化也是一样。
如果通过充定向的方式改变文件内容(>
or >>
),atime 不会发生变化。
之前有一个测试,可以参考: 2013/04/07, ls 按时间排序
Linux 并没有创建时间,这是令人费解的,可能是早期文件系统没有这个信息吧。
PS: 关于文件的创建时间,参考:2021-12-12 Linux 文件创建时间。
WebDev
2015-01-02
- HRM: Human Resource Management 人力资源管理
- CRM: Customer Relationship Management 客户关系管理
- OA: Office Automation 办公自动化
- ERP: Enterprise Resource Planning 企业资源计划
- SCM: Supply Chain Management
- EAM: Enterprise Asset Management
- FM: Financial Management 财务管理
- PLM: Product Lifecycle Management 产品生命周期管理
- WMS: Warehouse Management System 仓库管理系统
- BPM: Business Process Management 业务流程管理
- MIS: Management Information System 管理信息系统
- EIS: Enterprise Information System 企业信息系统
- OIS: Operations Information System 运营信息系统
- ESS: Enterprise Service System 企业服务系统
- CSM: Customer Service Management 客户服务管理
- BSS: Business Support System 业务支持系统
制造业
- MES: Manufacturing Engineering System 工艺设计系统
建筑业
- BIM: Building Information Model 建筑信息模型
医院
- HIS: Hospital Information System 医院信息化系统
- LIS: Laboratory Information System 化验室信息化系统
- PACS: Patient Administration and Care System 患者管理和护理系统
阅读 美文佳句
2014-11-21
所谓「大内档案」 这东西,在清朝的内阁里积存了三百多年,在孔庙里塞了十多年,谁也一声不响。自从历史博物馆将这残余卖给纸铺子,纸铺子转卖给罗振玉,罗振玉转卖给日本人,于是乎大有号啕之声,仿佛国宝已失,国脉随之似的。前几年,我也曾经过几个人的议论,所记得是的一个是金梁,登在《东方杂志》上;还有罗振玉和王国维,随时发感慨。最近的是《北新半月刊》上的《论档案的售出》蒋彝潜先生做的。
阅读 文学 美文佳句 韩寒
2014-10-22
第一次读到这篇文章的时候,应该还是 04 年左右,可能在读高一。
在我拿着一张试卷字数都难凑齐的时候,人家那时候也才高二,应试作文竟可以写到这么优秀。
我是很羞愧的。
阅读 文学
2014-10-22

SQLAlchemy DB Python SQL
2014-09-20
例子:搜索用户表 user
中字段 phone
包含 520
的行。
SQL
和 pymysql 等库一样的用:
keyword = '520'
conn.execute('select * from user where phone like "%%%s%%";' % keyword)
conn.execute('select * from user where phone like "%%%s%%";', keyword)
.like
方法
q = session.query(model.User.id, model.User.phone).filter(model.User.phone.like(f'%{keyword}%'))
qs = qs.all()
# print(qs.statement)
# SELECT "user".id, "user".phone
# FROM "user"
# WHERE "user".phone LIKE :phone_1
对应的大小写不敏感方法有 ilike
(lower("user".phone) LIKE lower(:phone_1)
)
还有:not_like
, not_ilike
.contains
方法
print(session.query(model.User.id, model.User.phone).filter(model.User.phone.contains(keyword)).statement)
# SELECT "user".id, "user".phone
# FROM "user"
# WHERE ("user".phone LIKE '%' || :phone_1 || '%')
.regexp_match
方法(1.4 新增)
对应的是 MySQL 支持的 REGEXP
操作符。
print(session.query(model.User.id, model.User.phone).filter(model.User.phone.regexp_match(keyword)).statement)
session.query(model.User.id, model.User.phone).filter(model.User.phone.regexp_match(keyword)).all()
# SELECT "user".id, "user".phone
# FROM "user"
# WHERE "user".phone <regexp> :phone_1
.startswith
和 .endswith
print(session.query(model.User.id, model.User.phone).filter(model.User.phone.startswith(keyword)).statement)
# SELECT "user".id, "user".phone
# FROM "user"
# WHERE ("user".phone LIKE :phone_1 || '%')
print(session.query(model.User.id, model.User.phone).filter(model.User.phone.endswith(keyword)).statement)
# SELECT "user".id, "user".phone
# FROM "user"
# WHERE ("user".phone LIKE '%' || :phone_1)
.match
方法
对应的是数据库的 MATCH (col1,col2,...) AGAINST (expr [search_modifier])
全文索引方法。
对单字段同样可用,不过需要先建立 FULLTEXT 索引。
print(session.query(model.User.id, model.User.phone).filter(model.User.phone.match(keyword)).statement)
session.query(model.User.id, model.User.phone).filter(model.User.phone.match(keyword)).all()
# SELECT "user".id, "user".phone
# FROM "user"
# WHERE "user".phone MATCH :phone_1
参考资料与拓展阅读
软件开发
2014-09-09

WebDev HTTP
2014-09-08
https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods
方法清单
GET
R 查
POST
C 增
PUT
U 改
DELETE
D 删
PATCH
U 改
HEAD
和 GET 相同,不过只返回请求头,不返回请求体
OPTIONS
返回这个请求支持的 HTTP 方法
TRACE
返回服务器收到的请求,调试用
CONNECT
为代理服务器准备的 HTTP 隧道方法
PATCH 和 PUT 的区别:PUT 是使用新版本来替换旧版本,PATCH 则是在旧版本的基础上修改。
- HTTP/1.0 只定义了 HEAD, GET, POST 三个方法,HTTP/1.1 增加了 PUT, DELETE, OPTIONS, TRACE, CONNECT 五个方法。
- PATCH 方法定义在 RFC 5789: PATCH Method for HTTP 中,目前还是一个草案,不在 HTTP/1.1 中。
- 除了 PATCH 方法之外,其实还出现过 LINK, UNLINK 两个方法,不过后来直接被无视了。
甚至和 PUT, DELETE 一同列在 HTTP/1.0 标准的 Additional Request Methods 中
而且还出现在了 HTTP/1.1 草案(RFC 2616)中
- TRACE, CONNECT 这两个方法很多 HTTP 服务都不支持,甚至有些服务都不支持 OPTIONS。
- Django 不支持 PUT, PATCH 方法(拿不到 body)。
示例
> OPTIONS / HTTP/1.1
> Host: www.markjour.com
> User-Agent: curl/7.74.0
> Accept: */*
< HTTP/1.1 200 OK
< Date: Sat, 11 Jan 2014 06:59:50 GMT
< Server: Apache
< Allow: OPTIONS,GET,HEAD,POST
< Vary: Accept-Encoding,User-Agent
< Content-Length: 0
< Content-Type: text/html
> GET / HTTP/1.1
> Host: www.baidu.com
> User-Agent: curl/7.74.0
> Accept: */*
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
< Connection: keep-alive
< Content-Length: 2443
< Content-Type: text/html
< Date: Sat, 11 Jan 2014 06:52:33 GMT
< Etag: "588603fd-98b"
< Last-Modified: Mon, 23 Jan 2017 13:24:13 GMT
< Pragma: no-cache
< Server: bfe/1.0.8.18
< Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
分类
RFC 7231 中的 Safe Methods,Idempotent Methods,Cacheable Methods。
- 安全:不会对资源产生影响(副作用除外,比如:请求计数,计费,日志等):
- GET
- HEAD
- OPTIONS
- TRACE
-
幂等:重复请求也不会对资源产生影响:
-
上面四个安全方法自不用说
- PUT
- DELETE
为什么 XXX 不幂等?
PUT,DELETE 可以导致之前的相关缓存失效。
为什么 POST/PATCH 方法 cacheable?
RFC 2616:
Some HTTP methods MUST cause a cache to invalidate an entity. This is either the entity referred to by the Request-URI, or by the Location
or Content-Location headers (if present). These methods are:
RFC 7231:
this specification defines GET, HEAD, and POST as cacheable, although the overwhelming majority of cache implementations only support GET and HEAD.
Mozilla Developer Network:
Only if freshness information is included
根据相关 RFC,如果响应头中有 Expires, Cache-Control 头,可以缓存 POST/PATCH。
我想,这个可能是为了避免资源重复创建而设计?
不过现实是,没有浏览器或服务器支持缓存 POST/PATCH 请求。
备注:最终可缓存状态还取决于 HTTP 状态码, 必须是 200、203、204、206、300、301 才可以缓存。
拓展
当然,只需要客户端和服务器端都能支持,请求方法可以自定义,如:
- LIST 列出资源,和 GET 方法对应
- UPLOAD 上传
- DOWNLOAD 下载
- EXIST 是否存在
- COLLECT 收藏
- STAR 星标
- VOTEUP 赞
- VOTEDOWN 踩
- 等等
Update @ 2020-04-01:
WebDAV 协议就可以看作是一个 HTTP 拓展, 增加了以下方法的支持:
- COPY 复制
- LOCK 锁定
- MKCOL 创建集合(目录)
- MOVE 移动
- PROPFIND 查询属性
- PROPPATCH 修改属性
- UNLOCK 解锁
附:相关 RFC
参考资料与拓展阅读