2016-02-25 92 views
1

我有一個bash循環,如下所示:擊跳過睡眠和進入下一個循環迭代

something(){ 
    echo "something" 
} 

while true; do 
    something 
    sleep 10s 
done | otherCommand 

當迴路處於睡眠狀態時,我希望能夠以能夠運行的功能從跳過睡眠步驟的終端開始,繼續循環的下一次迭代。

例如,如果腳本已經睡了5秒鐘,我想讓命令停止腳本進入休眠狀態,繼續下一次循環,運行something,然後再繼續休眠。

回答

2

這不是萬無一失的,但可能是足夠強大:

要中斷sleep命令,運行:

pkill -f 'sleep 10s' 

注意,腳本運行sleep命令打印有點像當sleep死亡時,繼以stderr:<script-path>: line <line-number>: <pid> Terminated: 15 sleep 10s。奇怪的是,你不能用sleep 10s 2>/dev/null來壓制這個腳本;要抑制它,你必須將2>/dev/null作爲一個整體應用於while循環,或作爲整體應用於腳本調用。

正如@ miken32在評論中指出,該命令試圖殺死所有命令其調用命令行匹配sleep 10s,雖然 - 除非你是root運行 - 查殺只會間爲比賽成功由於沒有許可殺掉其他用戶的進程而被處理。

爲了安全起見[R,你可以明確地限制匹配到自己的流程:

pkill -u "$(id -u)" -f 'sleep 10s' 

真正安全使用,但是要求您捕捉你的運行腳本的PID(進程ID),將其保存到一個文件,並使用該文件中的PID與pkill-P選項,該選項限制與指定PID的子進程匹配 - 請參見this answer(謝謝,@ miken32)。

+1

我上次試過這個,它似乎不適用於循環。我不知道爲什麼。它現在有效,謝謝。 – Marcel

+1

值得一提的是,無論這些命令是否從腳本啓動,都將會終止這些「睡眠」命令。可能不值得擔心,但[這個問題](http://askubuntu.com/questions/575704/how-can-i-wake-a-sleeping-bash-script)有一個詳細的解決方案,其中的命令你想殺的並不是獨一無二的。 – miken32

+0

@ miken32是的,我試圖用PID做點什麼。出於某種原因,當睡眠處於循環狀態時,它似乎不起作用。也許我只是一個小菜鳥。 – Marcel

0

如果你想跳過睡眠,使用這樣的一個文件,你可以摸:

if [ ! -f /tmp/skipsleep ]; then 
    sleep 10 
fi 

當你要打斷睡眠命令,殺了它!

+0

我希望它跳過當前的睡眠。說它已經睡了5秒。我想讓命令停止腳本進入休眠狀態,進入下一個循環,運行'something'並重新開始休眠。如果我正確讀取該文件,則不會這樣做,而是如果文件「/ tmp/skipsleep」總是跳過睡眠。對不起,如果我的問題含糊不清。 – Marcel

0

你可以從read -t 10而不是睡眠命名管道讀:通過「其他人補充說:」命名管道道具

something() 
{ 
    echo "something" 
} 
somethingelse() 
{ 
    echo "something else" 
} 

mkfifo ~/.myfifo 
while cat ~/.myfifo; do true; done | 
    while true 
    do 
    something 
    read -t 10 && somethingelse 
    done 

現在,每當另一個腳本編寫與echo > ~/.myfifo先進先出,循環會跳過目前等待並繼續下一次迭代。

這樣,不同的用戶或等待十秒鐘的不同腳本不會互相干擾。

下面的解決方案如果腳本在前臺運行並且您正在等待,則工作。當然,你需要一個有效的循環退出條件。您也可以檢查輸入的值並以不同的方式對其執行操作。在這種情況下,按除'j'以外的任何鍵都會迭代循環。按'j'會將某些人的輸出傳送給awk。

something() 
{ 
    echo "something" 
} 
somethingelse() 
{ 
    echo "something else" 
} 

while true; do 
    something |awk '{print "piping something: " $0 }' 
    read -t 3 -s -n 1 answer 

    if [ $? == 0 ]; then 
     echo "you didn't want to wait!" 
    fi 

    if [ "$answer" = "j" ]; then 
     somethingelse | awk '{print "piping something else: " $0 }' 
    fi 
done 
+0

我看不出這會如何幫助我。請詳細說明。 – Marcel

+0

在這個問題中沒有提到'read'。 – miken32

+0

不,但他問他如何打斷睡眠並重復循環。 – user5976242

0

如果它的交互性,然後只使用「讀取-t#」而不是「睡眠#」。

然後您可以按回車鍵跳過超時。