来自后台脚本的pidof用于另一个后台进程

时间:2014-05-19 10:15:58

标签: c++ linux

我编写了一个c ++程序来检查进程是否正在运行。这个过程是在后台独立发布的。

,当我在前台运行它时,我的程序工作正常,但是当我计划它时,它会工作。

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;
     }

其输出为&#34; ERROR:code = 256&#34;

先谢谢。

2 个答案:

答案 0 :(得分:2)

如果您真的想要pipe(2)fork(2)execve(2)然后阅读pidof命令的输出,那么至少应使用popen(3) { {1}}不在Posix API中;至少

ReadCommandOutput

BTW,你没有具体说明如果有几个进程(或没有进程)运行 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构建snprintf命令(并且您应该害怕code injection进入该命令,因此请适当引用参数)。您可以通过访问proc(5)文件系统来找到您的命令:您pidof上的opendir(3),然后循环readdir(3)以及每个数字名称为1234的条目(以数字开头)readlink(2)"/proc/"条目,例如exe ...)。不要忘记/proc/1234/exe并测试每个系统调用。

请阅读Advanced Linux Programming

请注意,像Poco这样的库或像Qt这样的工具包(它有一个没有任何GUI的图层closedir,并提供QCore ....)可能对你。

至于你的QProcess失败的原因,我们无法猜测(可能是一个权限问题,或者可能没有任何你想要的过程)。尝试至少在另一个终端以root身份运行它。测试其退出代码,并显示其标准输出&amp; stderr 至少用于调试目的。

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

顺便说一下,您还可以改进crontab(5)条目。你可以让它运行一些shell脚本,它使用logger(1)和(用于调试)运行/var/run/testProg1.pid,其输出重定向到其他地方。您还可以阅读pidof发送给root的邮件。

答案 1 :(得分:0)

最后,我使用su命令解决了这个问题

我用过

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

而不是

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