使用ps檢查命令是否只有一個例項
阿新 • • 發佈:2018-12-24
有一個業務指令碼,用lua寫的,執行在debian linux下面,要求不可以啟動多次。
linux下控制一個程式不可以啟動多次方法挺多,這一次用了從ps讀程序的方法。
很簡單,只要一條語句,而且不需要特殊的許可權,普通使用者就可以使用。
os.execute(“test (which lua)|wc -l) -eq 1”)
判斷這個函式返回值是不是為0就可以了,為0表示正常,即只有一個例項在執行。
簡單解釋一下。
(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