2009-04-13 13 views
8

我在尋找我的bash發出蜂鳴聲,如果我執行命令需要超過一個特定的壁時間更 (比如1分鐘)。慶典發出蜂鳴聲,如果命令的時間超過1分鐘,完成

,如果它不斷每隔幾分鐘嗶那裏,直到後,我按下回車鍵 或東西..這是馬麗娟。

任何聰明的想法?

我可以使用屏幕的監視功能作爲最後手段。 (我在cygwin上,但這應該不重要)。

讓我澄清一下:

$ ls  
    < output appears > 
$ rsync foo bar 
    < since this takes lot of time, i switch to other console 
     and forget this .. .and remember only after some time > 
    < so when this finished, i want it to beep > 
+0

我希望提供的腳本是你需要的 – Drakosha 2009-04-14 08:34:20

回答

2

在Linux中的命令,將發出蜂鳴聲爲您服務。查看Ubuntu可用的嘟嘟聲的源代碼(可能還有其他發行版),或者查看另一個源代碼http://www.johnath.com/beep/beep.c(我相信它是相同的代碼)。

它允許控制頻率,輕鬆長度和重複(除其他外)。

要真正得到它的工作,你需要在後臺啓動您的實際工人程序的腳本,然後進入一個"sleep 60"循環,發出聲響,直到它完成。

以下腳本應該是一個很好的開始。你喜歡的東西運行:

beeper sleep 3600 

,並在後臺運行的sleep 3600,蜂鳴每分鐘,直到它完成。

#!/bin/bash 
$* & 
pid=$! 
oldmin=$(date +%M) 
exf=$pid 
while [[ $exf == $pid ]] ; do 
    min=$(date +%M) 
    if [[ $oldmin != $min ]] ; then 
     beep 
     oldmin=$min 
    fi 
    exf="$(ps -ef | awk '{print $2}' | grep $pid)" 
    sleep 2 
done 

這是如何工作的。它將參數作爲後臺進程運行並保存進程ID。然後,它每隔幾秒鐘循環一次,檢查是否發生分鐘變化,並在發生這種情況時發出嗶嗶聲(因此,此處的第一聲蜂鳴可能會持續一分鐘)。

從環路退出當處理從ps輸出消失發生。

你甚至可以做蜂鳴器睡眠3600 &把一大堆的背景。要停止嗶嗶聲,要麼停止蜂鳴器進程(如果希望工作繼續而不發出嘟嘟聲)或殺死工作進程本身(這會停止工作和發出嗶嗶聲)。

+1

1.`$ *`?分詞和路徑名的擴展會吞噬你的寶寶。 2.`ps`檢查一個PID是否還活着? Nonono,男人殺,閱讀關於殺-0。 3.捲曲很多? – lhunath 2009-04-13 08:22:27

+0

這就是爲什麼我說腳本是一個開始(我也沒有添加其他功能,如幫助消息或錯誤檢查命令是否啓動)。 ps工作正常,所以沒有必要改變它,儘管其他功能可用(我承認我不知道'殺-0',這很好)。 – paxdiablo 2009-04-13 10:25:15

-1

我不知道隨便,如果它工作在bash的,但有許多炮彈像

command && echo ^G 

(CTRL-G)命令的成功完成後會發出蜂鳴聲。當你想執行一個長時間運行的命令,然後在另一個窗口中工作,但在第一件事情完成時得到通知時,這通常很有用。 (我還不清楚,如果這是你的目標或沒有。)

0

我敢肯定,我用類似:

echo "\007" 

沒有* nix的外殼方便進行測試。

0
echo "\007" 
  • 蜂鳴聲我。

    $!

  • 返回最後一個進程的PID在bash中後臺運行,所以你可以睡在上面,並驗證其是否仍在運行。

爲了更清楚,使用$!捕獲pid。在無限循環的睡眠,並檢查是否PID上面還活着。

後(希望)瞭解你想要什麼,下面的代碼:

#! /bin/bash 

if [[ "$#" != "1" ]] 
then 
    echo "Usage: $0 <command>" 
    echo "Will wait till the command finishes and starts beeping once a minute" 
    exit 1 
fi 

CMD="$1" 
SECS_BETWEEN_BEEPS="60" 

# echo commmand and start time: 
echo "@@ Command: '${CMD}'" 
echo "@@ Starting at `date`" 

# execute and wait till finish: 
"${CMD}" 
wait 

# echo finish time: 
echo "@@ Finished at `date`" 

# beep once in SECS_BETWEEN_BEEPS: 
while ((1)) 
do 
    echo -en '\a' 
    sleep "${SECS_BETWEEN_BEEPS}" 
done 
-2

你問兩個完全不同的東西在這裏。首先,你問做什麼在一分鐘後得到的蜂鳴聲,然後你問的命令完成後獲得的蜂鳴聲。這兩件事是完全不同的。

# bof [command] [args...] - Beep on Finish 
bof() { 
    "[email protected]"; local r=$? 

    printf '\a' 
    return $r 
} 

此函數運行一個命令,然後發出嗶嗶聲一次次命令的完成,同時確保該命令的退出代碼是函數的退出代碼。

# bot [command] [args...] - Beep on Timeout 
bot() { 
    { sleep 60; printf '\a'; } & 

    "[email protected]"; local r=$? 

    kill $! 
    return $r 
} 

此功能,除非該指令完成的時間之前(這裏,60秒,一分鐘)在一定時間後發出蜂鳴聲一次。

# bem [command] [args...] - Beep every Minute 
bem() { 
    { while sleep 60; do printf '\a'; done; } & 

    "[email protected]"; local r=$? 

    kill $! 
    return $r 
} 

這是蜂鳴分鐘,只要你的命令仍然活着的早期功能的一個簡單的適應。

# bofem [command] [args...] - Beep on Finish every Minute 
bofem() { 
    "[email protected]"; local r=$? 

    until read -t 60 -n 1; do printf '\a'; done 
    return $r 
} 

最後,它會發出蜂鳴下命令完成每分鐘但僅後一個功能。一直髮出聲響,直到你打一個鍵停止。然後,該函數返回您的命令的退出代碼。

我認爲這將涵蓋所有你可能用於解決問題的基礎。

使用(並結合),它們像這樣:

bof rsync foo bar:  # Beep when rsync finishes. 
bot ssh foo 'ls bar/' # Beep if the 'ssh' process takes too long to run. 
0

我喜歡大同提供了答案。看看什麼 '嗶' 可以這樣做:

[email protected]:/usr/src/linux # beep --help 

用法:嗶[-f頻率] [-l長度] [-r 代表] [-d延遲] [-D延遲] [ -s] [-c] [-e]

嘟嘟[選項...] [-n] [ - 新] [選項...] ...嘟嘟[-h] [ - -help] 嗶[-v] [-V] [--version]

所以,你可以擺動的蜂鳴聲(使它們更響亮,時間越長,或兩者)作爲計劃繼續運行時間超過預期。

如果你在這裏工作,你可以讓腳本播放每個人最喜歡的80的點擊的MUSAC版本,如果沒有其他理由讓它停下來,肯定會吸引某人到終端。

3

一個不起眼的建議:如果你有一個你知道需要一段時間的命令,只需用分號按照命令,然後發出嘟嘟聲。

rsync foo bar; beep