如果命令需要超过 1 分钟才能完成,bash 会发出蜂鸣声

问题描述 投票:0回答:7

如果我执行的命令需要更多时间,我正在寻找我的 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 >
bash exec
7个回答
4
投票

一个谦虚的建议:如果您知道某个命令需要一段时间,只需在命令后面加分号,然后发出嘟嘟声即可。

rsync foo bar; beep

2
投票

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

它可以让您轻松控制频率、长度和重复次数(等等)。

要真正让它工作,您需要一个脚本,在后台启动实际的 worker 程序,然后进入

"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
的输出中消失时,就会退出循环。

您甚至可以执行 beeper sleep 3600 并将整个过程置于后台。要停止蜂鸣声,请终止蜂鸣器进程(如果您希望工作继续而不发出蜂鸣声)或终止工作进程本身(这将停止工作和蜂鸣声)。


0
投票

我确定我用过类似的东西:

echo "\007"

没有方便测试的 *nix shell。


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

0
投票

我喜欢 Pax 提供的答案。看看“嘟嘟”能做什么:

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

用法:beep [-f 频率] [-l 长度] [-r 代表] [-d 延迟] [-D 延迟] [-s] [-c] [-e 设备]

beep [选项...] [-n] [--new] [选项...] ...蜂鸣声[-h] [--help] 嘟嘟声 [-v] [-V] [--版本]

因此,当程序运行时间比预期更长时,您可以振荡蜂鸣声(使蜂鸣声更大、更长或两者兼而有之)。

如果你努力的话,你可以让脚本播放每个人最喜欢的 80 年代热门歌曲的 MUSAC 版本,这肯定会吸引某人到终端,如果没有其他原因,除了让它停止。


-2
投票

我不知道它是否可以在 bash 上运行,但是对于许多 shell 来说,类似

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

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


-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.

	
© www.soinside.com 2019 - 2024. All rights reserved.