crond中使用flock命令的坑

2021-09-23 20:15:02 字數 1859 閱讀 8949

需要定期去執行乙個php指令碼,首先想到的是通過crond命令來實現這個功能。但是,在crond的執行過程中發現乙個詭異的事情。在crond中的配置如下。

*/1 * * * * root /usr/bin/flock -xn /tmp/test.lock -c '/usr/bin/php /home/hailong/test.php > /tmp/test.tt 2>&1'

指令碼只會在第一次成功執行,之後就不會再執行。當刪除/tmp/test.lock檔案後,php指令碼又能正常執行了。執行完一次後,就又不能正常執行了。

大家看到,配置檔案最後增加了 2>&1。為啥要加2>&1呢?請檢視博文《

乙個echo引起的程序崩潰》

另外,細心的朋友也會發現,我們使用了flock命令。使用flock命令是為了防止指令碼被併發重複執行。更多控制crond指令碼併發重複執行的方法,請檢視《解決crond指令碼執行併發衝突問題》

把crond配置中把flock去掉。如下:

*/1 * * * * root /usr/bin/php /home/hailong/test.php > /tmp/test.tt 2>&1

發現指令碼可以正常執行了。那必定是flock的問題。flock作為乙個成熟的linux命令,有問題的可能性不大。最大的可能性就是php**中某部分**和flock衝突。php**如下:

<?php

$f = popen("/home/exfilter restart", "r");

while(!feof($f))

}pclose($f);

file_put_contents("/tmp/test.log", date("y-m-d h:i:s"));

?>

之前說過,只有第一次,flock的鎖檔案不存在的時候,才能正常執行。當鎖檔案存在後,就不再正常執行。php程式執行完畢後,flock並沒有釋檔案鎖。那我們看下,/tmp/test.lock檔案是被那個檔案所占用。

[hailong@vhost ~]$ sudo /usr/sbin/lsof | grep test.lock

exfilter 29821 root 3r reg 202,1 0 90439710 /tmp/test.lock

[hailong@vhost ~]$ ps aux | grep 29821

root 29821 0.1 0.2 175224 22596 ? ssl 07:46 0:00 /home/exfilter -d

56667 30068 0.0 0.0 69460 852 pts/0 s+ 07:49 0:00 grep 29821

可見,test.lock檔案正是被php程式中popen函式啟動的程序所占用。由於,啟動的是乙個守護程序,程序不退出,鎖一直被占用。

啟用flock命令,改用其他方法。更多方法請檢視博文《解決crond指令碼執行併發衝突問題》

linux系統上的檔案鎖主要分為協同鎖(advisory lock)和強制鎖(mandatory lock)。在linux上使用的檔案鎖大部分為協同鎖,而且使用強制鎖的時候也要檢查系統是否支援強制鎖.

協同鎖,是使用者程序主動申請檔案鎖,鎖才能起作用。比如,a程序已經對檔案加了協同鎖,如果b程序不去申請鎖,而直接對檔案進行寫操作,也是可以的。

強制鎖,是由作業系統核心保證的。不需要使用者程序自己去申請。

flock命令使用的就是協同鎖。

當乙個主程序獲取乙個檔案鎖後,fork出的子程序也會獲取這個檔案鎖。

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

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

flock命令使用

除了多種語言提供 flock 系統呼叫或函式,linux shell 中也提供了 flock 命令。flock 命令最大的用途就是實現對 crontab 任務的序列化。在 crontab 任務中,有可能出現某個任務的執行時間超過了 crontab 中為此任務設定的執行週期,這就導致了當前的任務例項還...

Crond命令使用介紹

簡介 crond是linx下用來執行定時任務的乙個守護程序,類似於windows下的計畫,當在crond中設定了定時任務,系統會每分鐘檢查是否有要執行的定時任務。安裝 常用命令 設定定時任務 crontab檔案中,每一行都代表乙個任務,每行的每個字段代表一項設定,它的格式分為6個字段,前5個代表時間...