1. 程式人生 > >使用ps檢查命令是否只有一個例項

使用ps檢查命令是否只有一個例項

有一個業務指令碼,用lua寫的,執行在debian linux下面,要求不可以啟動多次。

linux下控制一個程式不可以啟動多次方法挺多,這一次用了從ps讀程序的方法。
很簡單,只要一條語句,而且不需要特殊的許可權,普通使用者就可以使用。
os.execute(“test (psax|grepluatest.lua|grep(which lua)|wc -l) -eq 1”)
判斷這個函式返回值是不是為0就可以了,為0表示正常,即只有一個例項在執行。

簡單解釋一下。

()psax|grepluatest.luapsaxluatest.luawhichlualua/usr/b
in/luagrep
(which lua)的意思是找出其中包含lua直譯器的行,如果不加這一條的話會有干擾。還是看個例子吧。
建立一個檔案luatest.lua:

!/usr/bin/lua

os.execute(“ps ax|grep luatest.lua”)
執行一下./luatest.lua,結果是這樣的
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
也就是說我們用grep檢查的命令也會被ps列出來,這樣一個例項就會有多條了,不符合我們的要求。那是不是我們檢查一下應該有3行資料就是說明只有單一例項呢?也不行。除了grep會帶來干擾,如果在crontab裡呼叫這個指令碼也會有干擾,如果在遠端機器用ssh呼叫也會有干擾。所以我們必須把干擾去掉。
這就是為什麼要加上grep