我编写了一个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;
先谢谢。
答案 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
并测试每个系统调用。
请注意,像Poco这样的库或像Qt这样的工具包(它有一个没有任何GUI的图层closedir
,并提供QCore
....)可能对你。
至于你的QProcess
失败的原因,我们无法猜测(可能是一个权限问题,或者可能没有任何你想要的过程)。尝试至少在另一个终端以root身份运行它。测试其退出代码,并显示其标准输出&amp; stderr 至少用于调试目的。
此外,更好的方法(假设pidof
是某种服务器应用程序,最多只能运行一个进程)可能是定义不同的约定。您的testProg1
可能首先将自己的pid写入testProg1
,然后您当前的应用程序可能会从该文件中读取pid并使用kill(2)和0信号编号检查该进程是仍然存在。
/var/run/testProg1.pid
,其输出重定向到其他地方。您还可以阅读pidof
发送给root
的邮件。
答案 1 :(得分:0)
最后,我使用su命令解决了这个问题
我用过
ReadCommanOutput("su -c 'pidof /root/test/testProg1' - root");
而不是
ReadCommanOutput("pidof /root/test/testProg1");