作业/流程结束时如何触发通知?


86

我工作的地方执行命令需要很长时间。

当命令执行结束时,是否可以使用命令/实用工具来通知我?它可能是一个弹出窗口,也可能是一点声音。


1
@slhck接受的答案很酷-我应该已经意识到这fg;say "Job finished"是可行的。但是...有没有什么方法可以使它进一步自动化-即按钟声或完成任何需要花费超过一分钟的阈值的工作后通知?是否有一个shell变量(例如在bash中),它是最后一条命令的经过时间?
Krazy Glew,2016年

... 2小时后,找到stackoverflow.com/questions/1862510 / ... ... ...在timer_stop中将'((($ timer_show> $ {LONG_RUNTIME:-300}))&&说“长时间运行的工作已完成” ...接下来,添加到emacs的编译命令...并通知我的Pebble手表(我讨厌手机通知)
Krazy Glew

Answers:


119

通常,如果运行命令之前就知道这一点,则可以使用以下命令启动它:

command; command-after &

这将command-after 退出前一个命令(无论其退出代码)之后执行。该&会在后台启动它。

如果您关心成功或失败的退出,请分别使用:

command && command-after-only-if-success &
command || command-after-only-if-fail &

如果命令已经启动,则可以使用作业控制将其挂起,然后将其返回到前台并fg与通知链在一起:

command
# enter Ctrl-z
fg ; command-after

现在……此后您要做什么取决于您的环境。

  • 任何系统上,您都可以“响铃”终端铃。取决于您的确切系统,什么才是真正有效的(BSD与GNU Linux等),但是tput bel应该起作用。不过,我现在无法可靠地对其进行测试。搜索“铃声”以了解更多信息。

  • Mac OS X上,可以使用AppleScript弹出Finder对话框:

    osascript -e 'tell Application "Finder" to display dialog "Job finished" '
    

    您可以让它对您说些什么:

    say "Job finished"
    

    或者,您可以使用Mountain Lion的通知系统:

    sudo gem install terminal-notifier # <= only need to do this once
    terminal-notifier -message "Job finished!" -title "Info"
    
  • GNOME中zenity可以显示一个GTK对话框,从命令行调用。另请参阅此堆栈溢出问题:在linux中显示来自bash脚本的消息框。可以通过您喜欢的软件包管理器进行安装。

    zenity --info --text="Job finished"
    
  • 有些发行版可能有xmessage。专门针对GTK环境gxmessage

  • 在实现桌面通知规范的桌面环境(例如UbuntuGNOME)上,有一个通知系统,您可以使用notify-send(部分libnotify)进行触发。

    notify-send "Job finished!"
    
  • KDE使用kdialog,例如:

    kdialog --passivepopup 'Job finished'
    

让我知道您使用了什么命令!我还添加了其他一些选项。
slhck 2011年

我在摆弄通知发送和xmessage。他们两个似乎都很有趣!下面是我在寻找下一件事- superuser.com/questions/345463/...
Utkarsh辛哈

2
在Mac OS X上,您也可以使用命令行实用程序“ say”。也有很多声音,请检查“ say -h”;)
2012年

1
您为什么建议“命令后”应异步运行?您是要说(command; command-after) &吗?
G-Man

该解决方案是针对Konsole用户的,并不是一个完美的解决方案,因为它取决于您的命令是冗长的命令直到完成,还是完全静音(没有输出),直到命令完成后才返回提示。但是,这正是我寻求帮助时所需要的。您可以配置Konsole弹出通知,播放声音等。然后,您必须打开外壳监视。如果您的命令在完成之前一直输出一堆东西,则监视是否静音;如果命令没有打印出任何内容,然后shell返回,则监视静音。
MrMas



5

要获取声音通知,您可以使用spd-say "Some text"。例:

some-command; spd-say "Yo"

什么操作系统?我在Mac或Ubuntu上都看不到它
Edward Falk

@EdwardFalk我正在使用Ubuntu
milkovsky '16

好的,我使用的是旧版本,所以也许是新版本。
爱德华·福尔克

1
它只是一个文本到语音的应用程序。您可以通过安装它sudo apt-get install speech-dispatcher。或使用替代方法askubuntu.com/questions/501910/…–
milkovsky

嗯,默认情况下未安装?我应该考虑一下。感谢您的链接。
爱德华·福尔克

4

我刚开始将notifu用于来自Cygwin的桌面通知。这是Windows的命令行通知应用程序。

例:

ls -l && /c/notifu-1.6/notifu64 /m "This is a simple Notifu message."

4

ntfy正是为此目的而写的。它是跨平台的,可以在长时间运行的命令完成后自动发送通知。

如果您拥有Python pip(大多数Linux发行版和MacOS都有),请按照以下方法安装它并启用自动通知:

$ sudo pip install ntfy
$ echo 'eval "$(ntfy shell-integration)"' >> ~/.bashrc
$ # restart your shell

http://ntfy.rtfd.io上查看

除此之外,它还可以:

  • 终端处于前台时自动停止通知(默认情况下支持并启用X11,iTerm2和Terminal.app)
  • 发送基于云的通知(推送,Pushbullet和XMPP)
  • 用于在进程结束时发送通知(不是上述的自动支持)
  • 手动发送通知(适用于脚本!)

对你好。这确实是最有用的答案。
亚当·比特林迈耶

我同意。我使用它在桌面上显示通知,并将通知同时推送到手机。
迈克尔(Michael)

3

对于Linux,有一个巧妙的技巧可以自动执行此操作,而不必每次都键入命令进行通知。

首先安装自动密钥。这有助于为不同的按键定义动作。

sudo apt-get install autokey-gtk

现在,在自动键中定义一个新短语并将热键分配为Alt + Enter。添加此短语:

; notify-send "Job finished!" &
  #

请注意,第一行之后的新行很重要。

另外,添加一个窗口过滤器。我使用guake和终端。包括您使用的任何其他终端。

.*(guake)|(Terminal).*

你完成了!!

现在,每当您需要获取命令通知时,请使用Alt + Enter而不是Enter / Return来运行它。

资料来源:http : //dotpad.blogspot.in/2014/12/notification-when-command-finished.html


3

尽管其他答案已经涵盖了完成工作通知的大多数方式,但是由于您以以下格式提出问题,我想给我两美分:

我工作的地方执行命令需要很长时间。

我也有同样的问题。有时某些东西可以运行15分钟。

我的.bashrc文件具有以下功能:

# push a notification to your phone. can be handy if you're running a
# build and you want to be notified when it's finished.
push() {
    curl -s -F "token=PUSHOVER_TOKEN" \
    -F "user=PUSHOVER_USER" \
    -F "title=terminal" \
    -F "message=$1" https://api.pushover.net/1/messages.json > /dev/null 2>&1
}

这使用Pushover应用程序将通知推送到我的手机。这样,我可以去吃午餐或参加会议,但仍会收到离开之前在计算机上开始的工作的通知。

我以以下方式使用它:

command_to_run && push "yes! command finished successfully!" || push "awww man! something failed :-("

因此,如果命令返回正确的退出代码,则将执行第一次推送。出现错误时,将执行第二个错误。

Ofc您需要在Pushover创建一个用户,并注册一个应用以从https://pushover.net/发送通知。

希望这对您有所帮助!


好的,“推入”是一项向安装了“推入”应用程序的手机发送通知的Web服务吗?
爱德华·福尔克

1
它是一项网络服务,可通过现代化的网络浏览器将通知发送到手机,计算机和其他所有设备。因此,您可以在PC和电话上打开推翻功能,并在所有设备上收到通知。整齐吧?:-)
Thatkookooguy's

1

如果使用csh或tcsh作为交互式外壳,则可以使用以下notify命令:

% long-running-command &
[1] 14431
% notify %1
% 
(later, when the command finishes)
[1]    Done                          long-running-command

您可以使用set -b或在bash中达到类似的效果set -o notify

这可能不符合您的要求,因为它所做的只是打印一条消息。我不认为可以将其配置为弹出窗口或响铃。


我试图避免查看外壳,以查明工作是否完成。不过谢谢!
Utkarsh Sinha,


1

如果你使用npm节点通知提供一个跨平台解决方案

notify -t "Agent Coulson" --icon https://raw.githubusercontent.com/mikaelbr/node-notifier/master/example/coulson.jpg -m "Well, that's new. "

预习

  • Linux KDE

Linux KDE

  • 视窗

视窗

  • 苹果系统

苹果电脑

  • 低吼

低吼


1

希望几年前我注意到这个线程。我的解决方案与slhck的解决方案基本相同,但是我编写了一个脚本。我用它所有的时间。发表在这里分享。

#!/bin/bash

msg='all done'
quiet=false
if [ "$1" = '-q' ]; then quiet=true; shift; fi
if [ $# -gt 0 ]; then msg="$*"; fi

echo -ne "\x1b]0;$msg\a"
if [ -x /usr/bin/zenity ]; then
  unset WINDOWID
  exec zenity --info --text="$msg"
elif [ -x /usr/bin/xmessage ]; then
  exec xmessage -nearmouse "$msg"
elif [ -x /usr/bin/osascript ]; then
  if ! $quiet; then say "done" &; fi
  osascript -e "tell application \"System Events\" to display dialog \"$msg\""
else
  echo $msg
fi

一点点解释:字符串"\x1b]0;$msg\a"是ANSI转义序列,用于将消息放入执行该消息的窗口的标题栏中。我发现有时可以很方便地看到消息来自哪个窗口。



0

另一种可能性是使用alertLinux上的Works。

>any-command; alert

如图所示,它会发出通知。 警报通知


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.