PostgreSQL异常重启postmaster.pid处理
时间:2022-07-28
本文章向大家介绍PostgreSQL异常重启postmaster.pid处理,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文介绍启动时pid文件即锁文件的处理。
若异常宕机,导致pid文件残留,那么重启时会自动将这个文件删除吗?
main>PostmasterMain->CreateDataDirLockFile->CreateLockFile::
for (ntries = 0;; ntries++){
// O_EXCL若存在则返回失败,errno是17
fd = open(filename, O_RDWR | O_CREAT | O_EXCL, pg_file_create_mode);
if (fd >= 0)
break;
if ((errno != EEXIST && errno != EACCES) || ntries > 100)//重试100次
could not create lock file
fd = open(filename, O_RDONLY, pg_file_create_mode);
...
if ((len = read(fd, buffer, sizeof(buffer) - 1)) < 0)
...
close(fd);
//0表示检查进程是否存在。ESRCH:没有这个进程;EPERM:操作不允许
if (kill(other_pid, 0) == 0 ||(errno != ESRCH && errno != EPERM)){
lock file "%s" already exists
}
if (unlink(filename) < 0)//删除,然后循环再试创建
...
}
//此时创建成功
if (write(fd, buffer, strlen(buffer)) != strlen(buffer))//写入pid内容
...
if (pg_fsync(fd) != 0)
...
if (close(fd) != 0)
...
说明:
1)会以O_RDWR | O_CREAT | O_EXCL形式open,若存在的话会返回创建文件失败。
2)若创建失败则会重试100次
3)若文件已存在,则以只读的形式再次open并读取文件内容
4)解析出pid,并通过kill(pid,0)判断进程是否存在(注意,若有子进程残留也会判断出来)
5)若有进程不存在,则将这个文件删除,然后进行重试
6)创建成功后,将当前进程信息写入文件并sync持久化。
7)最后将文件句柄关闭
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CentOS 6.8 安装vsftpd的方法步骤
- centos7下搭建ZooKeeper3.4中间件常用命令小结
- Linux性能测试 pmap命令详解
- Linux7.7设置交换分区SWAP的方法
- 在Linux里安装和启动nginx的方法
- Linux下如何对ISO文件编辑的方法示例
- Linux中创建新用户并赋予指定目录的相关权限
- Linux服务器下安装配置Nginx的教程
- Linux文件目录结构(小白版)
- 基于Linux中vnc配置端口号的修改方法
- Linux下安装grafana并且添加influxdb监控的方法
- 玩命学JVM:认识JVM和字节码文件
- 使用CatBoost进行不确定度估算:模型为何不确定以及如何估计不确定性水平
- 拒绝 kill -9,让 SpringBoot 优雅停机!
- SpringBoot整合Activiti7的实现代码