前端 flock 防止重新執行方法

seraphimhunter · October 14, 2019 · 27 hits
(adsbygoogle = window.adsbygoogle || []).push({});

印象中以前寫 PHP 有用過 flock
但這只用在簡單 PHP 上面
最近看到 flock 指令
突然想啟以前寫 PHP
有用過這個

RPubs - Linux 小撇步:利用 flock 來做同步和非同步應用 備份圖

裡面有提到 flock 基本用法

1
2
3

sleep 10
date

儲存成 test.sh 並且打開執行權限(chmod 700 test.sh)
此時如果我們打開兩個 shell, 並且約同時執行:

flock /tmp/demo.lock /tmp/test.sh

簡單測試用兩個 command line 測試
但我還不確定有沒有照順序執行

我有簡單開三個 command line 測試
確定不會照順序執行

flock 預設為-x

-c 後面下 command line,通常放在最後面

-x exclusive lock

-s shared lock

-n or -xn or -sn
當下有執行程式 (錯誤說法),不會執行程式

有趣的 xxx.lock 檔案一直都會在!!!

簡單來說就是當 shared lock,別的程式 (shared lock) 還是能執行,但是 exclusive lock 不行
反之
當 exclusive lock 程式執行, shared lock 和 exclusive lock 都不能執行!!!

可以開三個 command line 玩玩看

1
2
3
4
flock -s  /tmp/demo.lock /tmp/test.sh
flock -x /tmp/demo.lock /tmp/test.sh
flock -sn /tmp/demo.lock /tmp/test.sh
flock -xn /tmp/demo.lock /tmp/test.sh

linux lock 種類

  • shared lock

  • exclusive lock

同時持有一個 shared lock 的 process 數量並沒有限制. 但同時只有一個 process 有 exclusive lock.(Exclusive lock 會拒絕其他 shared lock 和 exclusive lock)
無論 process 對於檔案的存取方式為何 (R/W, ReadOnly, WriteOnll), 都可以使用 flock() 對檔案加上 shared lock 或 exclusive lock
shared lock 跟 exclusive lock 可以互相轉換. 但轉換的過程不是 atomic 的. 轉換的步驟是先移除舊的鎖然後建立新的鎖. 中間若有另一個新鎖上去, 轉換過程就會發生失敗並且失去原本的鎖。
再將 shared lock 轉成 exclusive lock 的過程中. 若有另一個 process 持有相同的 shared lock, 那他就會被 blocking, 除非他有設置 LOCK_NB

參考: CODING IS ART: Linux 檔案鎖 (File Locking) 備份圖

我覺得善用這個特性,寫排成會非常方便
印象中有看過程式適用ps去看關鍵字找東西
但透過這個真的會很方便,又不用寫程式!!!

更多設定方法可參考 Linux 防止 Shell 指令稿重複執行教學 - G. T. Wang 備份圖

2019-10-01
找到查看 lock 檔案方法
[Linux] 使用 lsof, lslocks, fuser 指令列出目前鎖定中的 file locks | EPH 的程式日記
process - How to list processes locking file? - Unix & Linux Stack Exchange

No Reply at the moment.
You need to Sign in before reply, if you don't have an account, please Sign up first.