linux 只啟動乙個程序例項

2021-06-26 17:34:50 字數 803 閱讀 2170

很多應用程式都只應該啟動乙個執行例項,特別是設計檔案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命令輸出可能不一樣,指令碼需要考慮移植。

程序只執行乙個例項

守護程序往往需要設定使其只執行乙個例項,這裡展示檔案鎖的方式實現 1.使用fcntl 函式設定檔案鎖 include include include include include include include int main else pause return 0 2.使用flock 設定鎖 ...

win32 linux 只啟動乙個程序

windows oninitdialog handle m hmutex createmutex null,true,t szsel2collecter if getlasterror error already exists linux 下面用檔案鎖實現程序只能開啟單個例項,win32 用crea...

C 中使用事件只啟動乙個例項

現有乙個程式,只能啟動乙個例項 啟動時,如果檢測到例項已啟動,則啟用並顯示到最前端 否則啟動乙個新的例項 為此可以通過事件實現。判斷是否已啟動 bool isformexists form frmowner string strevent catch waithandlecannotbeopened...