2014-05-19 56 views
2

我写了一个C++程序来检查进程是否正在运行。这个过程在后台独立启动。我的程序在前台运行时运行良好,但是当我安排它时,它不起作用。pidof从另一个后台进程的后台脚本

int PID= ReadCommanOutput("pidof /root/test/testProg1"); /// also tested with pidof -m 

我做出/etc/cron.d/myscript时间脚本如下安排它: -

45 15 * * * root /root/ProgramMonitor/./testBkg > /root/ProgramMonitor/OutPut.txt 

可能是什么原因呢?

 string ReadCommanOutput(string command) 
     { 
      string output=""; 
      int its=system((command+" > /root/ProgramMonitor/macinfo.txt").c_str()); 
      if(its==0) 
      { 
        ifstream reader1("/root/ProgramMonitor/macinfo.txt",fstream::in); 
        if(!reader1.fail()) 
        { 
         while(!reader1.eof()) 
         { 

          string line; 
          getline(reader1,line); 
          if(reader1.fail())// for last read 
          break; 
          if(!line.empty()) 
          { 
          stringstream ss(line.c_str()); 
          ss>>output; 
          cout<<command<<" output = ["<<output<<"]"<<endl; 
           break; 
         } 
       } 
       reader1.close(); 
       remove("/root/ProgramMonitor/macinfo.txt"); 
       } 
      else 
       cout<<"/root/ProgramMonitor/macinfo.txt not found !"<<endl; 
     } 
     else 
      cout<<"ERROR: code = "<<its<<endl; 
     return output; 
    } 

其输出来作为 “ERROR:代码= 256”

感谢advacee。

+0

您应该编辑您的问题表现出更多的代码,特别的代码你'ReadCommanOutput' –

+0

请转储您的'ReadCommanOutput'垃圾,并使用'popen' –

+0

我已经使用popen先生,它没有奏效。 –

回答

0

最后我用su命令

解决了这个问题,我已经使用

  ReadCommanOutput("su -c 'pidof /root/test/testProg1' - root"); 

与其使用

  ReadCommanOutput("pidof /root/test/testProg1"); 
+0

你可能打开了一个巨大的安全漏洞.... –

+0

最新情况如何?请重定向我。 –

+0

如果您可以在没有密码的情况下为root运行'su',那么您有一个很大的安全漏洞。 –

2

如果你真的想pipe(2)fork(2)execve(2)然后读取pidof命令的输出,你至少应该使用popen(3)因为ReadCommandOutput不是POSIX的API中;起码

pid_t thepid = 0; 
FILE* fpidof = popen("pidof /root/test/testProg1"); 
if (fpidof) { 
    int p=0; 
    if (fscanf(fpidof, "%d", &p)>0 && p>0) 
     thepid = (pid_t)p; 
    pclose(fpidof); 
} 

顺便说一句,你没有指定,如果几个进程(或无)正在运行的testProg1应该发生什么......;你也需要检查结果pclose

但是你不需要;实际上你会想要构建,也许使用snprintfpidof命令(你应该害怕code injection进入该命令,所以适当引用参数)。您可以通过访问proc(5)文件系统简单地找到您的命令:您将opendir(3)"/proc/",然后在readdir(3)循环,并为每个条目具有数字名称,如1234(以数字开头)readlink(2)exe条目像例如。 /proc/1234/exe ...)。不要忘记closedir并测试每个系统调用。

请阅读Advanced Linux Programming

注意,库等Poco或工具包等Qt(其具有层QCore没有任何图形用户界面,并且提供QProcess ....)可以是对你有用。至于为什么你的pidof失败,我们不能猜测(也许是一个权限问题,或者也许没有更多的任何过程像你想的那样)。至少尝试在另一个终端中以root身份运行它。测试其退出代码,并至少出于调试目的显示其stdout & stderr

此外,更好的方法(假设testProg1是某种服务器应用程序,最多只能在一个进程中运行)可能需要定义不同的约定。您的testProg1可能首先将自己的pid写入/var/run/testProg1.pid,然后您的当前应用程序可能会从该文件读取pid,并使用kill(2)和0信号编号检查该过程是否仍存在。

顺便说一句,你也可以改善你的crontab(5)条目。你可以让它运行一些shell脚本,它使用logger(1)和(用于调试)运行pidof,其输出重定向到别处。您也可以阅读cron发送给root的邮件。

+0

对不起,先生,我没有提到ReadCommandOutput是我自己的函数,它通过首先将它写入文本文件并返回它通过读取该文本文件来返回命令的输出。 –

+0

是的,但这是一个很大的错误。至少使用'popen'!我猜你的'ReadCommandOutput'有问题(可能不检查系统调用失败)。 –

+0

我用上面的代码gien替换了ReadCommandOutput中的代码。它从前台运行良好,但是当我计划它时,它正在打印pid = 0。我正在处理上面提到的另一种情况,即testProg1将编写它的pid。非常感谢您的回复。 –