Linux 文件锁

庆云2年前技术文章1089


1、背景

Linux 系统定时任务正在执行时,可能会遇到上个周期的任务还没有执行完,这样便会造成相同的任务同一时间有过个任务进程在执行。如果任务有对互斥资源操作时,有可能产生死锁。

2、用法参考

flock 命令,是 linux 的文件锁命令。可以通过一个锁文件,来控制多个任务进程的互斥性。用法如下:

$ flock -h
Usage:
 flock [options] <file|directory> <command> [command args]
 flock [options] <file|directory> -c <command>
 flock [options] <file descriptor number>

Options:
 -s  --shared                      获得共享锁
 -x  --exclusive                   获得排他锁(默认)
 -u  --unlock                      移除锁
 -n  --nonblock                    失败而不等待
 -w  --timeout <secs>              等待一段时间
 -E  --conflict-exit-code <number> 冲突或超时后的退出代码
 -o  --close                       在运行命令前关闭文件描述符
 -c  --command <command>           通过 shell 运行一条命令

 -h, --help                        显示此帮助并退出
 -V, --version                     输出版本信息并退出


3、操作步骤

3.1 任务互斥

*/5 * * * * flock -xn /tmp/receive-ossutil-1.lock -c  /root/rabbitmq-comsumer.sh
*/5 * * * * flock -xn /tmp/receive-ossutil-2.lock -c  /root/rabbitmq-comsumer.sh
*/5 * * * * flock -xn /tmp/receive-ossutil-3.lock -c  /root/rabbitmq-comsumer.sh
  • x 表示文件锁为互斥文件锁,这个参数可以省略,默认即为互斥文件锁。

  • n 表示当有任务执行时,直接退出,符合我们的逾期。

3.2 排队等待

*/10 * * * * flock -w 20 /tmp/my.lock -c /root/rabbitmq-comsumer.sh
  • 排队执行,每个任务等待 20s,超时则退出。

3.3 共享锁

# 共享锁
*/10 * * * * flock -s /tmp/my.lock -c /root/rabbitmq-comsumer.sh

3.4 忽略锁

*/10 * * * * flock -u /tmp/my.lock -c /root/rabbitmq-comsumer.sh
  • 忽略锁,直接执行。

3.5 自定义退出码

*/10 * * * * flock -E 1 -w 20 /tmp/my.lock -c /root/rabbitmq-comsumer.sh

4、注意事项

在自定义退出码时,尽量使用 1 位的数字,当使用多位数字时,会出现不是自定义的其他返回码。

5、结果检查

创建相关定时计划任务后,观察是否符合预期。

相关文章

AD域主备部署

AD域主备部署

总览在本篇文章中, 我将记录部署多 DC 实现高可用方案的详细步骤, 期间我会尽量使用 PowerShell 来实现相应的动作, 实在找不到命令或者 GUI 更方便的再附截图. 主要步骤分为:部署 2...

Nginx限流

Nginx限流

一、背景         限流的目的是通过对并发访问/请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务(定向到错误页),多应用于高并发场景和安全防护场景。通过限流有效地减缓暴力密码破解攻击,也可...

k8s集群状态与日志查看

一、状态查看1. 查看 Pod 状态以及运行节点kubectl get pods -o widekubectl -n kube-system get pods -o wide2. 查看 Pod 事件k...

MySQL 同步方式

同步方式一、分类同步大致为异步、半同步、增强版同步、全同步;二、详情1.异步复制MySQL 默认的复制策略,Master处理事务过程中,将其写入Binlog就会通知Dump thread线程处理,然后...

Ansible部署和使用(sshpass)

Ansible部署和使用(sshpass)

简介Ansible默认通过 SSH 协议管理机器。安装Ansible之后,不需要启动或运行一个后台进程,或是添加一个数据库。只要在一台电脑(可以是一台笔记本)上安装好,就可以通过这台电脑管理一组远程的...

CDH实操--集群ip替换

CDH实操--集群ip替换

1 背景恰逢机房迁移,自建CDH集群需要调整ip网段。。。2 操作步骤2.1 停止CDH集群2.1.1 控制台停止集群服务2.1.2 控制台停止Cloudera Management Ser...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。