2012-08-13 60 views
2

以下命令行調用timeout(沒有意義,僅用於測試原因)不能按預期工作。它等待10秒,並且不會在3秒後停止命令的工作。爲什麼?爲什麼`timeout`不適用於管道?

timeout 3 ls | sleep 10 
+0

你究竟期待什麼? – FrankieTheKneeMan 2012-08-13 22:20:11

+0

@FrankieTheKneeMan我期望,'timeout'執行'ls |睡10'。由於'ls |睡眠10'將需要至少10秒鐘,'超時'應該停止它。但'超時'不會。 – 2012-08-14 08:54:39

回答

9

你的命令做的是運行timeout 3 ls並將其輸出到管道sleep 10。因此sleep命令不在timeout的控制之下,並且總是會休眠10秒。

這樣的事情會產生所需的效果。

timeout 3 bash -c "ls | sleep 10" 
+0

現在我可以看到我的錯誤了。很好的解決方法。非常感謝(再次),你真的幫了我很多。 – 2012-08-15 13:25:31

+0

不是問題約翰。很高興我能幫上忙 :) – 2012-08-15 13:28:14

3

'ls'命令不應該花3秒鐘運行。我認爲發生的是你說的(1)在3秒後ls上的超時(再次發生這種情況,因爲ls不應該接近3秒運行),然後(2)將結果輸入到睡眠10中不需要比你提供的數字更多的參數。因此,ls發生,超時並不重要,bash睡10秒。

+1

'ls'可能需要很長時間才能在具有大量文件的目錄中運行。 – jordanm 2012-08-13 22:36:36

+0

當然,你是對的。我做了一些我不應該在答案中的假設,謝謝你的洞察力。 – mjgpy3 2012-08-14 02:22:56

1

我知道如何讓你後的效果的唯一方法,就是把管道命令到一個單獨的文件:

cat > script 
ls | sleep 10 
^D 

timeout 3 sh script 
+0

你可以使用進程替代來做內聯並避免臨時文件 - 'timeout 3 sh <(echo「ls | sleep 10」)' – 2012-08-15 13:31:35

相關問題