如果命令完成所需时间超过1分钟,bash将发出嘟嘟声
我正在寻找我的bash发出嘟嘟声,如果我执行的命令需要更多的时间 超过一定的墙时间(比如1分钟) 如果它每隔几分钟就响一次直到我按回车键 或者别的什么。。太棒了 有什么好主意吗 我可以使用screen的监视器功能作为最后手段。 (我在cygwin上,但那不重要) 让我澄清一下:如果命令完成所需时间超过1分钟,bash将发出嘟嘟声,bash,exec,Bash,Exec,我正在寻找我的bash发出嘟嘟声,如果我执行的命令需要更多的时间 超过一定的墙时间(比如1分钟) 如果它每隔几分钟就响一次直到我按回车键 或者别的什么。。太棒了 有什么好主意吗 我可以使用screen的监视器功能作为最后手段。 (我在cygwin上,但那不重要) 让我澄清一下: $ ls < output appears > $ rsync foo bar < since this takes lot of time, i switch to o
$ 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 >
$ls
<输出出现>
$rsync foo bar
<由于这需要很多时间,我切换到其他控制台
忘了这件事。并且只在一段时间后记住>
<所以当这完成时,我希望它发出嘟嘟声>
Linux中有一些命令会为您发出嘟嘟声。查看Ubuntu(可能还有其他发行版)提供的beep源代码,或者查看其他源代码(我相信是相同的代码)
它可以让你轻松地控制频率、长度和重复次数
要让它真正工作,您需要一个脚本,它在后台启动实际的worker程序,然后进入的“sleep 60”
循环,直到它完成为止
#!/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
下面的脚本应该是一个好的开始。您可以通过以下方式运行它:
beeper sleep 3600
echo "\007"
它在后台运行sleep3600
,每分钟都会发出嘟嘟声,直到结束
#!/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&把所有的东西都放在背景中。要停止嘟嘟声,请关闭嘟嘟声进程(如果您希望在没有嘟嘟声的情况下继续工作)或关闭工作进程本身(这将停止工作和嘟嘟声)。我不知道它是否在bash上工作,但有许多类似的shell
command && echo ^G
(ctrl-g)将在命令成功完成后发出蜂鸣音。当您希望执行一个长时间运行的命令,然后在另一个窗口中工作,但在第一件事情完成时收到通知时,这通常非常有用。(我不清楚这是否是你的目标。)我肯定我用过类似于:
beeper sleep 3600
echo "\007"
没有现成的*nix shell可供测试
echo "\007"
- 给我嘟嘟声 美元
- 返回bash中在后台运行的最后一个进程的pid,以便您可以对其进行睡眠并验证它是否仍在运行
# bofem [command] [args...] - Beep on Finish every Minute
bofem() {
"$@"; local r=$?
until read -t 60 -n 1; do printf '\a'; done
return $r
}
在(希望)理解了您的需求之后,下面是代码:
#! /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
#/bin/bash
如果[[“$#”!=“1”]]
然后
echo“用法:$0”
echo“将等待命令完成并开始每分钟发出一次蜂鸣声”
出口1
fi
CMD=“$1”
_beep=“60”之间的秒数
#回显命令和开始时间:
echo“@@Command:'${CMD}”
echo“@@1从'date'开始”
#执行并等待完成:
“${CMD}”
等待
#回显完成时间:
echo“@@1在'date'完成”
#在两次嘟嘟声之间以秒为单位嘟嘟一声:
而((1))
做
echo-en'\a'
睡眠“${SECS\u_beep}”
完成
你问的是两个完全不同的问题。首先,您询问如何在一分钟后获取蜂鸣音,然后在命令完成后请求获取蜂鸣音。这是两件完全不同的事情
# 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
秒,一分钟),否则此功能在特定时间后会发出一次蜂鸣音
这是对早期函数的一个简单修改,只要您的命令仍然有效,它就会每分钟发出嘟嘟声
# 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.
我喜欢帕克斯提供的答案。看看“嘟嘟”能做什么:
root@tower:/usr/src/linux # beep --help
用法:嘟嘟声[-f频率][-l长度][-r
重复][d延迟][d延迟][s][c]
[-e设备]
嘟嘟声[选项…][-n][--新建]
[选项…]。。。嘟嘟声[-h][--help]
嘟嘟声[-v][-v][-版本]
因此,当程序继续运行的时间比预期的长时,您可以振荡蜂鸣音(使其更响亮、更长或两者兼而有之)
如果你努力的话,你可以让脚本播放大家最喜欢的80年代流行歌曲的MUSAC版本,这肯定会吸引一些人到终端,如果没有其他原因,只能让它停止。一个谦虚的建议:如果你有一个你知道需要一段时间的命令,只需在命令后面加一个分号,然后发出嘟嘟声
rsync foo bar; beep
1. <代码>$*?单词拆分和路径名扩展会吃掉你的孩子。2.
ps
检查PID是否仍然有效?诺诺诺,伙计们,请阅读关于kill-0的文章。3.复杂得多?这就是为什么我说脚本是一个开始(我也没有添加其他功能,例如帮助消息或错误检查命令是否启动)。ps运行良好,因此无需更改它,尽管有其他可用功能(我承认我不知道'kill-0',这很好)。我希望提供的脚本是您所需要的