有一個(gè)業(yè)務(wù)腳本,用lua寫(xiě)的,運(yùn)行在debian linux下面,要求不可以啟動(dòng)多次。
linux下控制一個(gè)程序不可以啟動(dòng)多次方法挺多,這一次用了從ps讀進(jìn)程的方法。
很簡(jiǎn)單,只要一條語(yǔ)句,而且不需要特殊的權(quán)限,普通用戶就可以使用。
os.execute(“test (psax|grepluatest.lua|grep" role="presentation" style="position: relative;">(psax|grepluatest.lua|grep(which lua)|wc -l) -eq 1”)
判斷這個(gè)函數(shù)返回值是不是為0就可以了,為0表示正常,即只有一個(gè)實(shí)例在運(yùn)行。
簡(jiǎn)單解釋一下。
()是取括号里命令执行的结果。psax是取当前系统正在运行的进程。|是管道,就是把前面一个命令的输出重定向到后一个命令的输入。grepluatest.lua就是找出psax的结果中包含luatest.lua的行,当然,不同的脚本要换成相应脚本的名字。whichlua的意思是找出lua在哪个目录下,或者也可以直接写成/usr/bin/lua。grep" role="presentation" style="position: relative;">()是取括號(hào)里命令執(zhí)行的結(jié)果。psax是取當(dāng)前系統(tǒng)正在運(yùn)行的進(jìn)程。|是管道,就是把前面一個(gè)命令的輸出重定向到后一個(gè)命令的輸入。grepluatest.lua就是找出psax的結(jié)果中包含luatest.lua的行,當(dāng)然,不同的腳本要換成相應(yīng)腳本的名字。whichlua的意思是找出lua在哪個(gè)目錄下,或者也可以直接寫(xiě)成/usr/bin/lua。grep(which lua)的意思是找出其中包含lua解釋器的行,如果不加這一條的話會(huì)有干擾。還是看個(gè)例子吧。
建立一個(gè)文件luatest.lua:
!/usr/bin/lua
os.execute(“ps ax|grep luatest.lua”)
執(zhí)行一下./luatest.lua,結(jié)果是這樣的
3331 pts/0 S+ 0:00 /usr/bin/lua ./luatest.lua
3332 pts/0 S+ 0:00 sh -c ps ax|grep luatest.lua
3334 pts/0 S+ 0:00 grep luatest.lua
也就是說(shuō)我們用grep檢查的命令也會(huì)被ps列出來(lái),這樣一個(gè)實(shí)例就會(huì)有多條了,不符合我們的要求。那是不是我們檢查一下應(yīng)該有3行數(shù)據(jù)就是說(shuō)明只有單一實(shí)例呢?也不行。除了grep會(huì)帶來(lái)干擾,如果在crontab里調(diào)用這個(gè)腳本也會(huì)有干擾,如果在遠(yuǎn)程機(jī)器用ssh調(diào)用也會(huì)有干擾。所以我們必須把干擾去掉。
這就是為什么要加上grep (whichlua)的原因,加上这一行,就可以把多余的过滤掉,只剩下一行。再用os.execute(“psax|grepluatest.lua|grep" role="presentation" style="position: relative;">(whichlua)的原因,加上這一行,就可以把多余的過(guò)濾掉,只剩下一行。再用os.execute(“psax|grepluatest.lua|grep(which lua)”)測(cè)試一下,得到
3606 pts/0 S+ 0:00 /usr/bin/lua ./luatest.lua
這下差不多了,最后一個(gè)wc -l是統(tǒng)計(jì)行數(shù),這樣獲得的結(jié)果就是當(dāng)前進(jìn)程中此腳本運(yùn)行的數(shù)量,這個(gè)數(shù)量用test -eq 1來(lái)判斷是不是為1,如果為1,說(shuō)明當(dāng)前只有一個(gè)腳本的實(shí)例在運(yùn)行,整個(gè)命令執(zhí)行成功,返回碼為0,這時(shí)os.execute的返回值也為0,可以用lua直接判斷了。