如果我执行的命令需要更多时间,我正在寻找我的 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 >
一个谦虚的建议:如果您知道某个命令需要一段时间,只需在命令后面加分号,然后发出嘟嘟声即可。
rsync foo bar; beep
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 并将整个过程置于后台。要停止蜂鸣声,请终止蜂鸣器进程(如果您希望工作继续而不发出蜂鸣声)或终止工作进程本身(这将停止工作和蜂鸣声)。
我确定我用过类似的东西:
echo "\007"
没有方便测试的 *nix shell。
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
我喜欢 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 版本,这肯定会吸引某人到终端,如果没有其他原因,除了让它停止。
我不知道它是否可以在 bash 上运行,但是对于许多 shell 来说,类似
command && echo ^G
成功完成命令后,(ctrl-g) 将发出蜂鸣声。 当您想要执行长时间运行的命令,然后在另一个窗口中工作,但在第一件事完成时收到通知时,这通常很有用。 (我不清楚这是否是你的目标。)
您在这里问两件完全不同的事情。 首先,您询问如何在一分钟后发出蜂鸣声,然后询问在命令完成后发出蜂鸣声。 这是完全不同的两件事。
# 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.