flock命令使用

2022-05-27 05:57:07 字數 1143 閱讀 6867

除了多種語言提供 flock 系統呼叫或函式,linux shell 中也提供了 flock 命令。

flock 命令最大的用途就是實現對 crontab 任務的序列化。在 crontab 任務中,有可能出現某個任務的執行時間超過了 crontab 中為此任務設定的執行週期,這就導致了當前的任務例項還未執行完成,crontab 又啟動了同一任務的另外乙個例項,這通常不是使用者所期望的行為。極端情況下,如果某個任務執行異常一直未返回,crontab 不會處理這種情形,會繼續啟動新的例項,而新的例項很可能又會異常,這樣就導致 crontab 對同一任務不斷的啟動新的例項,最終導致系統記憶體被耗盡,影響到整個作業系統的執行。為了防止crontab 任務出現多例項的情況,可以使用 flock 命令將crontab 中任務的週期性執行序列化。

在將corntab 中任務序列化時,flock 通過對乙個中間檔案加檔案鎖來間接實現同一時刻某個任務只有乙個例項執行的目標。對應的 crontab 中任務的描述形式如下:

* * * * * flock -xn /tmp/mytest.lock -c 'php /home/fdipzone/php/test.php'
這裡的定時任務是每分鐘執行一次,但是任務中並未直接執行目標命令 『php /home/fdipzone/php/test.php』 ,而是將命令作為 flock 的 -c 選項的引數。flock 命令中,-x 表示對檔案加上排他鎖,-n 表示檔案使用非阻塞模式,-c 選項指明加鎖成功後要執行的命令。因而上面flock 命令的整體含義就是:如果對 /tmp/mytest.lock 檔案(如果檔案不存在, flock 命令會自動建立)加鎖成功就執行後面的命令,否則不執行。

假如上面 php 命令要執行2分鐘,而crontab 任務每分鐘就會執行一次,如果當前 php 命令正在執行,說明 flock 已經鎖定了檔案 /tmp/mytest.lock,crontab 到了再次執行任務的時間時,會發現檔案已經被加了鎖。由於設定的是非阻塞模式的檔案鎖,flock 會在加鎖失敗時直接返回,並不執行php 命令,這樣就使 php 命令得以順序執行,crontab 任務就不會出現同時有兩個例項執行的情況了,達到了序列化目的。

今天上網查資料,看到乙個flock命令,然後想起來在之前的公司有次利用rsync同步檔案把伺服器搞死的一次故障,當時沒解決,後來就不了了之,我擦, 原來是這麼一回事,恍然大悟

crond中使用flock命令的坑

需要定期去執行乙個php指令碼,首先想到的是通過crond命令來實現這個功能。但是,在crond的執行過程中發現乙個詭異的事情。在crond中的配置如下。1 root usr bin flock xn tmp test.lock c usr bin php home hailong test.php...

crond中使用flock命令的坑 信海龍

信海龍 linux crond 摘要 現象 需要定期去執行乙個php指令碼,首先想到的是通過crond命令來實現這個功能。但是,在crond的執行過程中發現乙個詭異的事情。在crond中的配置如下。1 root usr bin flock xn tmp test.lock c usr bin php...

linux使用flock檔案鎖

使用linux flock 檔案鎖實現任務鎖定,解決衝突 格式 flock sxun w fd flock sxon w file c command flock help flock util linux ng 2.17.2 usage flock sxun w fd flock sxon w f...