如果命令需要超过1分钟才能完成,请发出哔哔声

时间:2009-04-13 06:58:48

标签: bash exec

如果我执行的命令需要更多,我正在寻找我的bash来发出哔哔声   比某个墙壁时间(比如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 >

7 个答案:

答案 0 :(得分:4)

一个简单的建议:如果你有一个你知道需要一段时间的命令,只需用分号跟随命令,然后发出哔哔声。

rsync foo bar; beep

答案 1 :(得分:2)

Linux中有一些命令可以为您发出哔哔声。查看Ubuntu(以及可能还有其他发行版)可用的蜂鸣声的源代码,或者查看另一个来源的http://www.johnath.com/beep/beep.c(我相信它是相同的代码)。

它允许您轻松控制频率,长度和重复(以及其他内容)。

要实际让它工作,你需要一个脚本在后台启动你的实际 worker 程序,然后进入"sleep 60"循环,直到它完成后发出哔哔声。< / p>

以下脚本应该是一个好的开始。你用类似的东西运行它:

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&amp;把所有的东西都放在后台。要停止哔哔声,要么杀掉蜂鸣器进程(如果你希望工作继续而不发出哔哔声)或者杀死工作进程本身(这将阻止工作和哔哔声)。

答案 2 :(得分:0)

我确定我使用了类似的东西:

echo "\007"

没有* nix shell方便测试。

答案 3 :(得分:0)

echo "\007"
  • 对我来说是哔哔声。

    $!

  • 返回bash中后台运行的最后一个进程的pid,因此您可以在其上休眠并验证它是否仍在运行。

更清楚的是,使用$捕获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

答案 4 :(得分:0)

我喜欢Pax提供的答案。看看'哔'可以做什么:

root@tower:/usr/src/linux # beep --help
  

用法:beep [-f freq] [-l length] [-r   reps] [-d delay] [-D delay] [-s] [-c]   [-e device]

     

哔| [选项...] [-n] [ - 新]   [选项...] ...哔哔[-h] [ - help]   哔哔[-v] [-V] [--version]

因此,当程序持续运行的时间超过预期时,您可能会发出哔哔声(使它们更响亮,更长或两者都振荡)。

如果您正在使用它,您可以让脚本播放每个人最喜欢的80次点击的MUSAC版本,这肯定会吸引某人到终端,如果没有其他原因而不是让它停止。

答案 5 :(得分:-1)

我不知道它是否适用于bash,但有许多类似

的shell
command && echo ^G
成功完成命令后,

(ctrl-g)将发出蜂鸣声。当您想要执行长时间运行的命令然后在另一个窗口中工作但在第一件事完成时得到通知时,这通常很有用。 (我不清楚这是不是你的目标。)

答案 6 :(得分:-2)

你在这里问两个完全不同的东西。首先你问一下如何在一分钟后发出哔哔声,然后你要求在命令完成后发出哔哔声。这两件事情完全不同。

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

    printf '\a'
    return $r
}

此命令运行命令,然后在命令完成后发出一次蜂鸣声,同时确保命令的退出代码是函数的退出代码。

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

    "$@"; local r=$?

    kill $!
    return $r
}

此功能在一定时间后发出一次哔声,除非命令在此之前完成(此处为60秒,一分钟)。

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

    "$@"; local r=$?

    kill $!
    return $r
}

这是对早期函数的简单修改,只要您的命令仍然存在,它就会每隔分钟发出嘟嘟声。

# bofem [command] [args...] - Beep on Finish every Minute
bofem() {
    "$@"; 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.