用Perl寫了一些監(jiān)控腳本,放在crontab中調(diào)度執(zhí)行。有時(shí)候會(huì)發(fā)現(xiàn)一個(gè)腳本運(yùn)行時(shí)間過(guò)長(zhǎng),會(huì)同時(shí)跑起多個(gè)實(shí)例,因此有必要為腳本加上控制,只運(yùn)行一個(gè)實(shí)例。
最簡(jiǎn)單自然的想法,在腳本中檢查并創(chuàng)建一個(gè)空的lock文件,腳本結(jié)束時(shí)再刪除。通過(guò)判斷文件是否存在的方式來(lái)判斷腳本是否已經(jīng)運(yùn)行。不過(guò)這樣做有個(gè)bug,如果腳本運(yùn)行過(guò)程中異常終止,lock文件沒(méi)有正常刪除,就會(huì)導(dǎo)致腳本無(wú)法再運(yùn)行。
空的lock文件不行,那么考慮在lock文件中加入一點(diǎn)內(nèi)容,比如進(jìn)程的PID號(hào),然后通過(guò)檢查該P(yáng)ID號(hào)的進(jìn)程是否還在運(yùn)行,就能避免上述bug了。在CPAN上有很多現(xiàn)成的模塊能夠完成上述功能,如File::Lockfile, File::Pid, Proc::PID::File 等。
下面是File::Lockfile的一個(gè)示例,非常簡(jiǎn)單:
以下是代碼片段:
通過(guò)查看File/Lockfile.pm的源代碼可以看到,判斷l(xiāng)ock文件中記錄的進(jìn)程是否已經(jīng)運(yùn)行,簡(jiǎn)單的通過(guò) kill -0 $pid 即可實(shí)現(xiàn)。所以即使不用上述模塊,自己實(shí)現(xiàn)也是非常容易的。
小結(jié):
該方法是在腳本中經(jīng)常用到限制單實(shí)例的方法,MySQL 等程序在每次啟動(dòng)前也會(huì)檢查上次遺留的 mysql.pid 文件。
另一個(gè)方法:給lock文件加排它鎖,判斷是否有鎖來(lái)確保唯一性。
新聞熱點(diǎn)
疑難解答
圖片精選