1. 程式人生 > >linux 只啟動一個程序例項

linux 只啟動一個程序例項

很多應用程式都只應該啟動一個執行例項,特別是設計檔案IO操作的程式,如果誤啟動了多個例項,可能會導致混亂的IO,進而導致檔案寫亂。

常見的做法:

1.生成pid檔案
這種做法最常見了,應用於大多數的Linux程式,如apache httpd, mysql。思路是配置一個pid檔案,當程式啟動時,對pid檔案加鎖,然後寫入本程序的pid,如果鎖失敗,說明有例項已經啟動了。這個方案非常可靠,唯一的不足是需要配置一個pid檔案,並且保證檔案目錄和檔案可寫。

2.埠搶佔
應用於大多數的Linux網路應用。思路是系統保證每個埠的TCP只能有一個程序監聽,那麼如果程式啟動時,監聽一個核心的埠,第二個執行的例項就會監聽失敗,無法啟動。這個方案同樣很有效,省去了一個額外的配置檔案,不足之處是一般只用於帶網路的程式。

3.共享記憶體鎖
比較小眾的方法,對方案1, 2的優化。方案1中的pid需要儲存一個檔案,檔案就需要配置路徑和許可權,並且這個檔案僅供程序使用,意義不大,所以考慮使用共享記憶體,通過shmget操作共享記憶體,然後寫入pid,這樣就不用生成可見的檔案。這個方案只存在一個很小的缺陷,需要配置共享記憶體的key,並保證不與系統其他應用衝突,一般來說,衝突概率非常小。

4.程序列表檢測
對於運維常用的方法。由於運維不一定能控制程式的修改,所以考慮從外部解決。crontab指令碼,查詢執行的程序數,一旦發現程序數與預期不符,那麼killall,重啟程序。這個方案是旁路方案,比上面的方式更通用,還可以監視程序數,避免某些子程序core。這個方案沒有什麼缺陷,如果硬要找一個的話,不同的系統ps命令輸出可能不一樣,指令碼需要考慮移植。