|
@@ -3,17 +3,61 @@
|
|
|
|
|
|
#include <iostream>
|
|
#include <iostream>
|
|
|
|
|
|
|
|
+#ifdef OS_UNIX
|
|
|
|
+#include "sys/statfs.h"
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+#ifdef OS_WIN
|
|
|
|
+#include <windows.h>
|
|
|
|
+
|
|
|
|
+#endif
|
|
|
|
+
|
|
extern iv::Ivlog * ivlog;
|
|
extern iv::Ivlog * ivlog;
|
|
extern iv::Ivfault * ivfault;
|
|
extern iv::Ivfault * ivfault;
|
|
|
|
|
|
ProgMon::ProgMon(std::string path)
|
|
ProgMon::ProgMon(std::string path)
|
|
{
|
|
{
|
|
mvectorprog = loadprogunit(path);
|
|
mvectorprog = loadprogunit(path);
|
|
|
|
+
|
|
|
|
+ InitLog();
|
|
|
|
+
|
|
|
|
+ mpthread_stdout = new std::thread(&ProgMon::threadstdout,this);
|
|
}
|
|
}
|
|
|
|
|
|
ProgMon::~ProgMon()
|
|
ProgMon::~ProgMon()
|
|
{
|
|
{
|
|
- int i;
|
|
|
|
|
|
+ mbstdoutrun = false;
|
|
|
|
+ mpthread_stdout->join();
|
|
|
|
+
|
|
|
|
+ if(mbFileStdLog)
|
|
|
|
+ {
|
|
|
|
+ mbFileStdLog = false;
|
|
|
|
+ qint64 nsize = mFileStdLog.size();
|
|
|
|
+ mFileStdLog.close();
|
|
|
|
+
|
|
|
|
+ if(nsize == 0)
|
|
|
|
+ {
|
|
|
|
+ std::cout<<"Because no std log, delete std log. "<<std::endl;
|
|
|
|
+ mFileStdLog.remove();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if(mbFileLog)
|
|
|
|
+ {
|
|
|
|
+ mbFileLog = false;
|
|
|
|
+ qint64 nsize = mFileLog.size();
|
|
|
|
+ mFileLog.close();
|
|
|
|
+
|
|
|
|
+ if(nsize == 0)
|
|
|
|
+ {
|
|
|
|
+ std::cout<<"Because no error log, delete error log. "<<std::endl;
|
|
|
|
+ mFileLog.remove();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ unsigned int i;
|
|
for(i=0;i<mvectorprog.size();i++)
|
|
for(i=0;i<mvectorprog.size();i++)
|
|
{
|
|
{
|
|
if(mvectorprog[i].mProcess != 0)
|
|
if(mvectorprog[i].mProcess != 0)
|
|
@@ -237,15 +281,33 @@ void ProgMon::onProcessErrorStarted(QProcess::ProcessError error){
|
|
void ProgMon::onReadStandardOutput()
|
|
void ProgMon::onReadStandardOutput()
|
|
{
|
|
{
|
|
QProcess * proc = (QProcess *)sender();
|
|
QProcess * proc = (QProcess *)sender();
|
|
- QByteArray ba = proc->readAll();
|
|
|
|
- qDebug("process out: %s ",ba.data());
|
|
|
|
|
|
+ QByteArray ba = proc->readAllStandardOutput();
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ if(mbAllNoLog == false)
|
|
|
|
+ {
|
|
|
|
+ mMutex_stdout.lock();
|
|
|
|
+ if(mvectorstdout.size()<1000) mvectorstdout.push_back(stdoutunit(proc,ba));
|
|
|
|
+ mMutex_stdout.unlock();
|
|
|
|
+ }
|
|
|
|
+// qDebug("process out: %s ",ba.data());
|
|
}
|
|
}
|
|
|
|
|
|
void ProgMon::onReadStandardError()
|
|
void ProgMon::onReadStandardError()
|
|
{
|
|
{
|
|
QProcess * proc = (QProcess *)sender();
|
|
QProcess * proc = (QProcess *)sender();
|
|
- QByteArray ba = proc->readAll();
|
|
|
|
- qDebug("process error: %s ",ba.data());
|
|
|
|
|
|
+ QByteArray ba = proc->readAllStandardError();
|
|
|
|
+
|
|
|
|
+ if(ba.size() == 0)return;
|
|
|
|
+ LogError(proc,ba);
|
|
|
|
+
|
|
|
|
+// if(mbAllNoLog == false)
|
|
|
|
+// {
|
|
|
|
+// mMutex_stdout.lock();
|
|
|
|
+// if(mvectorstdout.size()<1000) mvectorstdout.push_back(stdoutunit(proc,ba));
|
|
|
|
+// mMutex_stdout.unlock();
|
|
|
|
+// }
|
|
|
|
+// qDebug("process error: %s ",ba.data());
|
|
}
|
|
}
|
|
|
|
|
|
void ProgMon::onProcessEnd()
|
|
void ProgMon::onProcessEnd()
|
|
@@ -323,7 +385,9 @@ void ProgMon::onChRead()
|
|
QProcess * proc = (QProcess *)sender();
|
|
QProcess * proc = (QProcess *)sender();
|
|
QByteArray ba = proc->readAll();
|
|
QByteArray ba = proc->readAll();
|
|
|
|
|
|
- if(proc->currentReadChannel() == 1)
|
|
|
|
|
|
+ int ncha = proc->currentWriteChannel();
|
|
|
|
+
|
|
|
|
+ if(proc->currentWriteChannel() == 1)
|
|
{
|
|
{
|
|
std::cout<<"Receive a Error Output."<<std::endl;
|
|
std::cout<<"Receive a Error Output."<<std::endl;
|
|
LogError(proc,ba);
|
|
LogError(proc,ba);
|
|
@@ -332,7 +396,7 @@ void ProgMon::onChRead()
|
|
|
|
|
|
|
|
|
|
#ifdef QT_DEBUG
|
|
#ifdef QT_DEBUG
|
|
- qDebug("process INFO: %s ", ba.data());
|
|
|
|
|
|
+// qDebug("process INFO: %s ", ba.data());
|
|
#endif
|
|
#endif
|
|
|
|
|
|
if(mbAllNoLog == false)
|
|
if(mbAllNoLog == false)
|
|
@@ -433,12 +497,13 @@ void ProgMon::StartProc(ProgUnit *pu)
|
|
|
|
|
|
connect(pu->mProcess,SIGNAL(started()),this,SLOT(onProcessStarted()));
|
|
connect(pu->mProcess,SIGNAL(started()),this,SLOT(onProcessStarted()));
|
|
connect(pu->mProcess,SIGNAL(finished(int)),this,SLOT(onProcessEnd()));
|
|
connect(pu->mProcess,SIGNAL(finished(int)),this,SLOT(onProcessEnd()));
|
|
- connect(pu->mProcess,SIGNAL(readyRead()),this,SLOT(onChRead()));
|
|
|
|
- // connect(pu->mProcess,SIGNAL(readyReadStandardOutput()),this,SLOT(onReadStandardOutput()));
|
|
|
|
|
|
+// connect(pu->mProcess,SIGNAL(readyRead()),this,SLOT(onChRead()));
|
|
|
|
+ connect(pu->mProcess,SIGNAL(readyReadStandardOutput()),this,SLOT(onReadStandardOutput()));
|
|
|
|
+ connect(pu->mProcess,SIGNAL(readyReadStandardError()),this,SLOT(onReadStandardError()));
|
|
|
|
|
|
|
|
|
|
connect(pu->mProcess,SIGNAL(error(QProcess::ProcessError)),this,SLOT(onProcessErrorStarted(QProcess::ProcessError)));
|
|
connect(pu->mProcess,SIGNAL(error(QProcess::ProcessError)),this,SLOT(onProcessErrorStarted(QProcess::ProcessError)));
|
|
-// connect(pu->mProcess,SIGNAL(readyReadStandardError()),this,SLOT(onReadStandardError()));
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
|
|
pu->mProcess->start(pu->strcmd.data());
|
|
pu->mProcess->start(pu->strcmd.data());
|
|
@@ -595,6 +660,12 @@ void ProgMon::setquit()
|
|
void ProgMon::threadstdout()
|
|
void ProgMon::threadstdout()
|
|
{
|
|
{
|
|
|
|
|
|
|
|
+ QString strhomepath = getenv("HOME");
|
|
|
|
+
|
|
|
|
+ int nNeedCheckSpace = 0;
|
|
|
|
+
|
|
|
|
+ bool bHaveHDDSpace = true;
|
|
|
|
+
|
|
while(mbstdoutrun)
|
|
while(mbstdoutrun)
|
|
{
|
|
{
|
|
bool bAllNoLog = true;
|
|
bool bAllNoLog = true;
|
|
@@ -639,13 +710,196 @@ void ProgMon::threadstdout()
|
|
else
|
|
else
|
|
{
|
|
{
|
|
|
|
|
|
|
|
+ if(bHaveHDDSpace == false)
|
|
|
|
+ {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ for(i=0;i<xvectorstdout.size();i++)
|
|
|
|
+ {
|
|
|
|
+ unsigned int j;
|
|
|
|
+ std::string strappname;
|
|
|
|
+ std::string strarg;
|
|
|
|
+ bool bFind = false;
|
|
|
|
+ bool bSave = false;
|
|
|
|
+ mMutex.lock();
|
|
|
|
+ for(j=0;j<mvectorprog.size();j++)
|
|
|
|
+ {
|
|
|
|
+ ProgUnit *pu = &(mvectorprog.at(j));
|
|
|
|
+ if(xvectorstdout[i].mpProc == pu->mProcess)
|
|
|
|
+ {
|
|
|
|
+ strappname = pu->strappname;
|
|
|
|
+ strarg = pu->strargs;
|
|
|
|
+ bFind = true;
|
|
|
|
+ bSave = pu->mbSavestdout;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ mMutex.unlock();
|
|
|
|
+
|
|
|
|
+ if(bFind)
|
|
|
|
+ {
|
|
|
|
+ if(bSave)
|
|
|
|
+ {
|
|
|
|
+ if(nNeedCheckSpace <= 0)
|
|
|
|
+ {
|
|
|
|
+ // std::cout<<"check space."<<std::endl;
|
|
|
|
+ nNeedCheckSpace = 1000;
|
|
|
|
+ int nSpace = get_path_availspace(strhomepath);
|
|
|
|
+
|
|
|
|
+ // std::cout<<"hard space is "<<nSpace<<" MB."<<std::endl;
|
|
|
|
+ if(nSpace<100)
|
|
|
|
+ {
|
|
|
|
+ std::cout<<"Hard Disk No space to save std log."<<std::endl;
|
|
|
|
+ bHaveHDDSpace = false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ nNeedCheckSpace--;
|
|
|
|
+ if(bHaveHDDSpace)
|
|
|
|
+ {
|
|
|
|
+ QString strlog;
|
|
|
|
+ strlog = QDateTime::currentDateTime().toString("(yyyy/MM/dd hh:mm:ss:zzz")
|
|
|
|
+ + " | " + strappname.data() + " "+ strarg.data() + " "+") "
|
|
|
|
+ +xvectorstdout[i].mba.data();
|
|
|
|
+ WriteStdLog(strlog.toLatin1().data());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ std::cout<<"not found a std out 's process."<<std::endl;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ std::cout<<"threadstdout complete."<<std::endl;
|
|
}
|
|
}
|
|
|
|
|
|
void ProgMon::LogError(QProcess *proc, QByteArray &ba)
|
|
void ProgMon::LogError(QProcess *proc, QByteArray &ba)
|
|
{
|
|
{
|
|
|
|
+ std::cout<<"error is "<<ba.data()<<std::endl;
|
|
|
|
+
|
|
|
|
+ unsigned int i;
|
|
|
|
+ std::string strappname;
|
|
|
|
+ std::string strarg;
|
|
|
|
+ bool bFind = false;
|
|
|
|
+ mMutex.lock();
|
|
|
|
+ for(i=0;i<mvectorprog.size();i++)
|
|
|
|
+ {
|
|
|
|
+ ProgUnit *pu = &(mvectorprog.at(i));
|
|
|
|
+ if(proc == pu->mProcess)
|
|
|
|
+ {
|
|
|
|
+ strappname = pu->strappname;
|
|
|
|
+ strarg = pu->strargs;
|
|
|
|
+ bFind = true;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ mMutex.unlock();
|
|
|
|
+
|
|
|
|
+ if(bFind)
|
|
|
|
+ {
|
|
|
|
+ QString strlog;
|
|
|
|
+ strlog = QDateTime::currentDateTime().toString("yyyy/MM/dd hh:mm:ss:zzz")
|
|
|
|
+ + " | " + strappname.data() + " "+ strarg.data() + " "+" | Error: "
|
|
|
|
+ +ba.data() + "\n";
|
|
|
|
+ WriteLog(strlog.toLatin1().data());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void ProgMon::InitLog()
|
|
|
|
+{
|
|
|
|
+ QString strpath = getenv("HOME");
|
|
|
|
+
|
|
|
|
+ strpath = strpath + "/log";
|
|
|
|
+ QDir xDir(strpath);
|
|
|
|
+ if(xDir.exists() == false)
|
|
|
|
+ {
|
|
|
|
+ std::cout<<"dir "<<strpath.toLatin1().data()<<" not exist . Create it."<<std::endl;
|
|
|
|
+ if(xDir.mkdir(strpath) == false)
|
|
|
|
+ {
|
|
|
|
+ std::cout<<"make dir faile . dir is "<<strpath.toLatin1().data()<<std::endl;
|
|
|
|
+ mbFileLog = false;
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ QString strname = "IVSysMan-errlog-" + QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz.log");
|
|
|
|
+ QString strstdname = "IVSysMan-stdlog-" + QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz.log");
|
|
|
|
+ QString strstdpath = strpath + "/" + strstdname;
|
|
|
|
+ strpath = strpath +"/" + strname;
|
|
|
|
+
|
|
|
|
+ mFileLog.setFileName(strpath);
|
|
|
|
+
|
|
|
|
+ if(mFileLog.open(QIODevice::ReadWrite))
|
|
|
|
+ {
|
|
|
|
+ mbFileLog = true;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ std::cout<<" Create error log File Fail. File Path is "<<strpath.toLatin1().data()<<std::endl;
|
|
|
|
+ mbFileLog = false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ mFileStdLog.setFileName(strstdpath);
|
|
|
|
+
|
|
|
|
+ if(mFileStdLog.open(QIODevice::ReadWrite))
|
|
|
|
+ {
|
|
|
|
+ mbFileStdLog = true;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ std::cout<<" Create std log File Fail. File Path is "<<strpath.toLatin1().data()<<std::endl;
|
|
|
|
+ mbFileStdLog = false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void ProgMon::WriteLog(const char *strlog)
|
|
|
|
+{
|
|
|
|
+ if(mbFileLog)
|
|
|
|
+ {
|
|
|
|
+ mFileLog.write(strlog,strnlen(strlog,100000));
|
|
|
|
+ mFileLog.flush();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
|
|
|
|
+void ProgMon::WriteStdLog(const char *strlog)
|
|
|
|
+{
|
|
|
|
+ if(mbFileStdLog)
|
|
|
|
+ {
|
|
|
|
+ mFileStdLog.write(strlog,strnlen(strlog,100000));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+int ProgMon::get_path_availspace(const QString & path)
|
|
|
|
+{
|
|
|
|
+#ifdef OS_UNIX
|
|
|
|
+ struct statfs diskInfo;
|
|
|
|
+ statfs(path.toUtf8().data(), &diskInfo);
|
|
|
|
+
|
|
|
|
+ qDebug("%s 总大小:%.0lfMB 可用大小:%.0lfMB",path.toStdString().c_str(),(diskInfo.f_blocks * diskInfo.f_bsize)/1024.0/1024.0,(diskInfo.f_bavail * diskInfo.f_bsize)/1024.0/1024.0);
|
|
|
|
+ return (diskInfo.f_bavail * diskInfo.f_bsize)/1024.0/1024.0;
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#ifdef OS_WIN
|
|
|
|
+ LPCWSTR lpcwstrDriver=(LPCWSTR)path.utf16();
|
|
|
|
+
|
|
|
|
+ ULARGE_INTEGER liFreeBytesAvailable, liTotalBytes, liTotalFreeBytes;
|
|
|
|
+
|
|
|
|
+ if( !GetDiskFreeSpaceEx( lpcwstrDriver, &liFreeBytesAvailable, &liTotalBytes, &liTotalFreeBytes) )
|
|
|
|
+ {
|
|
|
|
+ qDebug() << "ERROR: Call to GetDiskFreeSpaceEx() failed.";
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+ return (quint64) liTotalFreeBytes.QuadPart/1024/1024;
|
|
|
|
+
|
|
|
|
+#endif
|
|
|
|
+}
|
|
|
|
|