簡體   English   中英

C ++執行bash腳本,終止並重新啟動當前進程

[英]C++ executing a bash script which terminates and restarts the current process

所以情況就是這樣,我們有一個C ++ datafeed客戶端程序,我們運行~30個具有不同參數的實例,並且編寫了3個腳本來運行/停止它們:start.sh stop.sh和restart.sh(運行停止) .sh然后start.sh)。

當存在大量數據時,客戶端“落后”實時。 我們通過將系統時間與列出的最新數據輸入時間進行比較來測試。 如果任何客戶端落后超過10分鍾左右,我想調用重啟腳本來啟動所有二進制文件,以便我們的數據盡可能接近實時。

通常我使用System(script.sh)調用腳本,但是重啟腳本使用kill查找並終止進程,但是調用System()也會使當前程序執行忽略SIGQUIT和SIGINT,直到system()返回。

除此之外,如果有兩個具有相同參數的並發執行,它們將發生沖突並且程序將掛起(這源於建立數據庫連接),因此我無法啟動新實例,直到舊實例被殺死並且我無法殺死如果忽略SIGQUIT那么當前的那個。

有沒有辦法解決? 二進制文件的當前狀態和丟失的一些數據如果已經達到閾值則完全無關緊要,我也不能讓程序自行重啟,因為如果其中一個實例落后,我們要重啟所有30個實例(因此數據中的間隙處於統一時間)。 是否有一種干凈的方法從C ++中調用腳本來移交控件並允許腳本從頭開始重新啟動程序?

僅供參考我們在CentOS 6.3上運行

使用exec()而不是system() 它將用新的流程取代您的流程。 請注意, exec()的調用方式和行為方式有很大不同: system()將其字符串參數傳遞給系統shell以運行。 exec()實際上執行一個可執行文件,你需要一次向進程提供一個參數,而不是讓shell為你解析它們。

這是我的兩分錢。

臨時解決方案:使用SIGKILL。
長期解決方案:使用其他系統調用(如exec)或通過重寫它來使用線程來優化代碼服務樹的一般邏輯。

如果你想更好的答案,也許你應該張貼一些代碼,或degeneralize問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM