3

我需要你的帮助 !

我制作了一个报告守护程序(在 c++ 中),它需要定期在服务器上执行一堆命令。

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

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

我尝试使用“sleep 20000”作为命令,子进程被杀死但睡眠命令仍在运行......不好。

第二个想法是使用 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 命令只是示例,实际命令可能会永远挂起)
4

1 回答 1

6

使用timeoutcoreutils 中的命令:

/usr/bin/timeout 5 /bin/sh -c "/bin/ps aux | /usr/bin/wc -l"
于 2013-01-07T10:22:19.413 回答