我一直在使用我发现的修改后的类来检查同一进程的另一个实例是否已在运行,问题是检查进程的方法是否会添加同一进程的另一个实例。如何检查进程是否在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文件。与同样检查的监督员一起工作良好。 –