《LINUX入門:crond腳本執(zhí)行并發(fā)沖突問題》要點(diǎn):
本文介紹了LINUX入門:crond腳本執(zhí)行并發(fā)沖突問題,希望對您有用。如果有疑問,可以聯(lián)系我們。
在計(jì)劃任務(wù)中,偶爾會看到反復(fù)執(zhí)行的情況:
例如我們公司的方案任務(wù)舉例:
*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testOne >/dev/null 2>&1 */2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testTwo >/dev/null 2>&1
這是兩分鐘執(zhí)行一次的任務(wù),并不克不及保證每次開啟的進(jìn)程能夠在兩分鐘內(nèi)絕對的執(zhí)行完畢關(guān)閉,進(jìn)程一直堆積的話,可能會把系統(tǒng)資源給耗盡,導(dǎo)致系統(tǒng)宕機(jī).
舉例:
新建test.php文件,代碼如下:
<?php sleep(70); ?>
添加方案任務(wù):
*/1 * * * * root cd /home/ganjincheng;php test.php
等待執(zhí)行,產(chǎn)生堆積
root 26722 0.0 0.0 9232 1064 ? Ss 12:05 0:00 /bin/sh -c cd /home/ganjincheng;php test.php root 26744 0.0 0.0 112304 8840 ? S 12:05 0:00 php test.php root 29102 0.0 0.0 9232 1060 ? Ss 12:06 0:00 /bin/sh -c cd /home/ganjincheng;php test.php root 29116 0.1 0.0 112304 8840 ? S 12:06 0:00 php test.php root 29906 0.0 0.0 103320 904 pts/3 S+ 12:06 0:00 grep test.php
這種辦法,就是對代碼進(jìn)行改造.增加是否有進(jìn)程執(zhí)行的判斷.如下面的代碼:
<?php $lockfile = '/tmp/mytest.lock'; if(file_exists($lockfile)){ exit(); } file_put_contents($lockfile, date("Y-m-d H:i:s")); sleep(70); unlink($lockfile); ?>
這種判斷文件是否不存在的方式,會有一個問題.那便是有可能程序未執(zhí)行到最后,也便是沒有刪除之前創(chuàng)建的mytest.lock文件.這會導(dǎo)致,之后程序?qū)⒉荒苷?zhí)行.
可以將第一種方案轉(zhuǎn)移到redis,memache中,進(jìn)行鍵值斷定.
如果計(jì)劃任務(wù)是對數(shù)據(jù)庫進(jìn)行存取,那可以進(jìn)行鎖表操作.偶爾我們也可以利用唯一索引與聯(lián)合索引的唯一性來避免反復(fù)插入情況
舉例:
$fp = popen("ps aux | grep 'test.php' | wc -l", "r"); $proc_num = fgets($fp); if ($proc_num > 3) { //這里要注意為什么進(jìn)程數(shù)要大于3,實(shí)際操作一遍你就明白了 exit; } sleep(70);
這種方式有一個弊病,就是ps命令要寫的精確.避免把不是執(zhí)行test.php腳本的進(jìn)程也統(tǒng)計(jì)到.如:
我們通過vim打開test.php文件.就會導(dǎo)致上面命令誤統(tǒng)計(jì).所以當(dāng)我們不小心vim打開test.php文件的時候,就執(zhí)行不起來了.
讓linux幫我們?nèi)喽ò?flock命令提供了文件鎖的功能.命令參數(shù)如下:
[root@www.linuxidc.com]# flock -h flock (util-linux-ng 2.17.2) Usage: flock [-sxun][-w #] fd# flock [-sxon][-w #] file [-c] command... flock [-sxon][-w #] directory [-c] command... -s --shared Get a shared lock -x --exclusive Get an exclusive lock -u --unlock Remove a lock -n --nonblock Fail rather than wait -w --timeout Wait for a limited amount of time -o --close Close file descriptor before running command -c --command Run a single command string through the shell -h --help Display this text -V --version Display version
設(shè)置裝備擺設(shè)舉例:
*/1 * * * * root flock -xn /tmp/mytest.lock -c 'php ./test.php'
本文永遠(yuǎn)更新鏈接地址:
學(xué)習(xí)更多LINUX教程,請查看站內(nèi)專欄,如果有LINUX疑問,可以加QQ交流《LINUX入門:crond腳本執(zhí)行并發(fā)沖突問題》。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/11350.html