我一直在使用我發現的修改後的類來檢查同一進程的另一個實例是否已在運行,問題是檢查進程的方法是否會添加同一進程的另一個實例。如何檢查進程是否在Red Hat Linux上運行?
當我的應用程序啓動時,一個新的進程ID被創建並可見有:
ps -A | grep "AppName"
有了這個,我得到一個在入境回來,我再檢查應用程序的另一個實例使用:
QString strCMD = "ps -A | grep \"" + mcstrAppName + "\"";
QProcess objProc;
objProc.start("bash", QStringList() << "-c" << strCMD);
if (objProc.waitForStarted() != true || objProc.waitForFinished() != true) {
mcpobjApp->exit(cleanExit(-1, "Unable to determine if another instance is running!"));
return;
}
只要「開始」方法被調用同一應用程序的另一個實例出現在進程表,再次與驗證:
ps -A | grep "AppName"
現在兩個條目分別顯示不同的PID。我也試過了:
QString strOptions = "-A | grep \"" + mcstrAppName + "\"";
QProcess objProc;
objProc.start("ps", QStringList() << strOptions);
結果是一樣的,兩個條目在進程表中。
有沒有辦法檢查另一個實例的進程表而不添加額外的實例?
有沒有看到,如果一個特定的可執行文件的方式從特定的可執行文件本身內部運行,而不是實際加載和運行可執行文件。相反,我建議你在特定文件上使用某種文件鎖。如果文件被鎖定,那麼程序正在運行,你可以做任何你需要做的事情。如果沒有鎖定,則鎖定並繼續。或者也許是一個共享的信號燈或類似的東西。 –
該方法的問題是,如果文件被鎖定,然後可執行文件存在問題,則看門狗無法重新啓動該進程。 – SPlatten
PID文件如何?內容是正在運行的進程的PID的文件?如果它存在並且PID存在且與可執行文件匹配,則該進程正在運行。如果文件不存在,或者PID不存在,或者它存在但是與可執行文件不匹配,那麼程序沒有運行,並且您覆蓋了PID文件。與同樣檢查的監督員一起工作良好。 –