使用管道执行命令并在c ++中执行超时(并读取stdout)

时间:2013-01-07 10:05:01

标签: c++ timeout command exec pipe

我需要你的帮助!

我做了一个报告deamon(用c ++),它需要在服务器上定期执行一堆命令。

一个简单的示例命令是:“/ bin / ps aux | / usr / bin / wc -l”

第一个想法是使用popen()分叉运行命令的子进程,并在父进程中设置一个alarm(),如果该命令尚未退出,则在5秒后终止该子进程。

我尝试使用“sleep 20000”作为命令,子进程被终止但是sleep命令仍在运行...不好。

第二个想法是使用execlp()而不是popen(),它使用简单的命令(即没有管道),如“ls -lisa”或“sleep 20000”。我可以得到结果,如果5秒后没有完成,则会杀死进程。

现在我需要执行“/ bin / ps aux | / usr / bin / wc -l”命令,显然它不能直接使用execlp(),所以我尝试了“hack”:

execlp("sh","sh","-c","/bin/ps aux | /usr/bin/wc -l",NULL);

我工作......或者我认为......我试过了

execlp("sh","sh","-c","sleep 20000",NULL); 

只是为了确定并且子进程在5秒后被终止(我的超时)但是sleep命令只是停留在那里......

我愿意接受建议(我愿意接受黑客攻击)!

提前致谢!

TLDR;

我需要一种方法:

  • 执行“复杂”命令,例如“/ bin / ps aux | / usr / bin / wc -l”
  • 获取其输出
  • 确保它被杀死,如果它需要超过5秒(ps命令只是示例,实际命令可能永远挂起)

1 个答案:

答案 0 :(得分:5)

使用coreutils的timeout命令:

/usr/bin/timeout 5 /bin/sh -c "/bin/ps aux | /usr/bin/wc -l"