2013-01-07 76 views
2

我需要你的幫助!用管道執行命令並在C++中超時(並讀取標準輸出)

我做了一個報告deamon(在C++中),它需要定期在服務器上執行一堆命令。

一個簡單的例子命令將是:「/斌/ ps的輔助|的/ usr /斌/ WC -l」

第一個想法是叉與POPEN運行命令一個子進程(),並設置如果該命令尚未退出,則在父進程中發出警報()以在5秒後終止該子項。

我試過使用「sleep 20000」作爲命令,子進程被終止,但睡眠命令仍在運行......不好。

第二個想法是使用execlp()代替popen(),它使用簡單命令(即沒有管道),如「ls -lisa」或「sleep 20000」。我可以得到結果,如果5秒後沒有完成,這些進程將被終止。

現在我需要執行「/ bin/ps aux |/usr/bin/wc -l」命令,顯然它不會直接與execlp()一起工作,所以我嘗試了「破解」:

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

我的作品...或者,所以我想......我想

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

只是要確定和子進程後5秒(我的超時),但睡眠命令就停在那兒殺死...

我打開的建議(我會解決爲黑客)!

在此先感謝!

TLDR;

我需要一種方法來:

  • 執行 「複雜」 的命令,比如 「/斌/ ps的輔助|在/ usr/bin中/ WC -l」
  • 得到它的輸出
  • 化妝知道它需要超過5秒鐘,它殺死了Coreutils的(ps命令只是和例子,實際的命令可能會永遠掛起)

回答

4

使用timeout命令:

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

謝謝!我目前無法測試,但當我回家時我會嘗試。 有一件事,儘管用我的解決方案殺死了子進程,但也殺死了「sh -c」,但不知何故,「sleep 20000」進程仍能保留下來。 – srsbsns

+1

在推薦'timeout'之前,我測試了它並確保'sleep'也被終止。 –

+1

'execlp(「timeout」,「timeout」,「5」,「sh」,「 - c」,「ls -lisa | grep etc」,NULL);' 它的作品,謝謝! – srsbsns

相關問題