在C++中使用管道和超时执行命令(并读取标准输出)

3

我需要你的帮助!

我制作了一个报告守护程序(用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命令仍然存在...

我可以接受建议(我可以用hack方式解决)!

谢谢!

TLDR;

我需要一种方法来执行“复杂”命令,例如“/bin/ps aux | /usr/bin/wc -l”,获取其输出,并确保在5秒钟内被杀死(ps命令只是一个示例,实际命令可能永远挂起)。

1个回答

7
使用coreutils中的timeout命令:
/usr/bin/timeout 5 /bin/sh -c "/bin/ps aux | /usr/bin/wc -l"

谢谢!我现在无法测试,但我会在回家后尝试! 不过有一件事,使用我的解决方案杀死子进程也会杀死“sh -c”,但不知何故,“sleep 20000”进程仍然能够保持。 - srsbsns
1
在推荐 timeout 之前,我进行了测试并确保 sleep 也被终止了。 - Anton Kovalenko
1
execlp("timeout","timeout","5","sh","-c","ls -lisa | grep etc",NULL); 它有效,谢谢! - srsbsns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接