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) 最後將檔案控制程式碼關閉
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31493717/viewspace-2696595/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 重學Java - 異常處理Java
- 重寫Laravel異常處理類Laravel
- 異常篇——異常處理
- 異常處理
- JSP 異常處理如何處理?JS
- 異常-throws的方式處理異常
- React 異常處理React
- JS異常處理JS
- oracle異常處理Oracle
- Python——異常處理Python
- Python異常處理Python
- ThinkPHP 異常處理PHP
- JavaScript 異常處理JavaScript
- JAVA 異常處理Java
- 異常的處理
- golang - 異常處理Golang
- 異常處理2
- 異常處理1
- Java 異常處理Java
- Abp 異常處理
- JAVA異常處理Java
- 08、異常處理
- SpringMVC異常處理SpringMVC
- 異常處理機制(二)之異常處理與捕獲
- Java 異常表與異常處理原理Java
- restframework 異常處理及自定義異常RESTFramework
- springboot下新增全域性異常處理和自定義異常處理Spring Boot
- NodeJS之異常處理NodeJS
- JAVA_異常處理Java
- React Native 異常處理React Native
- Spring Boot 異常處理Spring Boot
- PHP 核心 - 異常處理PHP
- GRpc異常處理FilterRPCFilter
- python異常捕捉處理Python
- 14. 異常處理
- 異常處理機制
- 異常處理方式throws
- 處理多個異常