Como posso acionar uma notificação quando um trabalho / processo termina?


86

O local em que trabalho possui comandos que levam muito tempo para serem executados.

Existe um comando / utilitário que eu possa usar para me notificar quando a execução do comando terminar? Pode ser uma janela pop-up ou talvez um pouco de som.


11
A resposta aceita do @ slhck é legal - eu deveria ter percebido que fg;say "Job finished"funcionaria. Mas ... existe alguma maneira de automatizar ainda mais - por exemplo, tocar a campainha ou notificar após a conclusão de qualquer trabalho que leva mais do que um limiar como um minuto? Existe uma variável de shell, por exemplo, no bash, que é o tempo decorrido do último comando?
Krazy Glew

... 2 horas depois, encontrado stackoverflow.com/questions/1862510/… ... put '(($ timer_show> $ {LONG_RUNTIME: -300})) && diz "trabalho de longa duração concluído"' em timer_stop ... em seguida, adicione a comandos de compilação emacs ... e notificar o meu Pebble assistir (eu odeio notificações de telefone)
Krazy Glew

Respostas:


119

Geralmente, se você sabe disso antes de executar o comando, basta iniciá-lo com:

command; command-after &

Isso executará command-after após a saída do comando anterior (independentemente do seu código de saída). O &iniciará em segundo plano.

Se você se preocupa com uma saída bem-sucedida ou com falha, use respectivamente:

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

Se o comando foi iniciado, você pode usar o controle de tarefas para suspendê-lo, retorne-o ao primeiro plano com o fgacorrentado com sua notificação:

command
# enter Ctrl-z
fg ; command-after

Agora ... o que você quer fazer depois disso depende do seu ambiente.

  • Em qualquer sistema , você pode "tocar" a campainha do terminal . Depende do seu sistema exato, o que realmente funciona (BSD vs. GNU Linux, etc.), mas tput beldeve funcionar. Eu não poderia testá-lo com confiabilidade no momento, no entanto. Pesquise "campainha" para descobrir mais.

  • No Mac OS X , você pode usar o AppleScript para abrir uma caixa de diálogo do Finder:

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

    Você poderia dizer algo para você:

    say "Job finished"
    

    Ou você pode usar o sistema de notificação do Mountain Lion:

    sudo gem install terminal-notifier # <= only need to do this once
    terminal-notifier -message "Job finished!" -title "Info"
    
  • No GNOME , zenitypode mostrar uma caixa de diálogo GTK, chamada na linha de comando. Veja também esta questão do Stack Overflow: mostrando uma caixa de mensagem de um script bash no linux . Pode ser instalado através do seu gerenciador de pacotes favorito.

    zenity --info --text="Job finished"
    
  • Algumas distribuições podem ter xmessage. Especificamente para ambientes GTK, existe gxmessage.

  • Em ambientes de desktop que implementam a Especificação de notificações da área de trabalho , como Ubuntu e GNOME , existe um sistema de notificação que você pode acionar notify-send(parte de libnotify).

    notify-send "Job finished!"
    
  • O KDE usa kdialog, por exemplo:

    kdialog --passivepopup 'Job finished'
    

Deixe-me saber qual comando você usou! Eu adicionei algumas outras opções também.
slhck

Estou brincando com notificar-enviar e xmessage. Ambos parecem ser interessantes! Aqui está a próxima coisa que procuro - superuser.com/questions/345463/…
Utkarsh Sinha 11/11

2
no Mac OS X, você também pode usar o utilitário de linha de comando "say". também há muitas vozes disponíveis, verifique "say -h";)
thinth 10/10/12

11
Por que você está sugerindo que o "comando após" seja executado de forma assíncrona? Você quis dizer (command; command-after) &?
G-Man

Esta solução é para usuários do Konsole e não é uma solução perfeita, pois depende de seu comando ser detalhado até que seja concluído ou completamente silencioso (sem saída) até que seja concluído, quando o prompt retornará. No entanto, é exatamente isso que eu precisava quando vim procurar ajuda. Você pode configurar o Konsole para exibir uma notificação, tocar um som, etc. Em seguida, você precisa ativar o monitoramento de shell. Monitore o silêncio se o seu comando produzir um monte de coisas até que seja concluído, ou o silêncio se não imprimir nada e o shell retornar.
precisa saber é o seguinte

20

Em sistemas tipo Unix, você pode tocar a campainha audível:

echo -e "\a"

Isto é realmente útil, além de uma notificação de mensagem no mac
Sirens

2
mesmo quetput bel
Dwight Spencer


5

Para obter uma notificação sonora, você pode usar spd-say "Some text". Exemplo:

some-command; spd-say "Yo"

Qual SO? Eu não vê-lo no Mac ou Ubuntu
Edward Falk

@EdwardFalk Estou usando o Ubuntu
milkovsky

OK, estou usando uma versão bastante antiga, talvez seja nas versões mais recentes.
Edward Falk

11
É apenas um aplicativo de conversão de texto em fala. Você pode instalá-lo via sudo apt-get install speech-dispatcher. Ou use alternativas askubuntu.com/questions/501910/…
milkovsky:

Ahh, não está instalado por padrão? Eu deveria ter pensado nisso. Obrigado pelo link.
Edward Falk

4

Comecei a usar o notifu para notificações da Cygwin na área de trabalho. É um aplicativo de notificação de linha de comando para Windows.

Exemplo:

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

4

Eu escrevi ntfyexatamente para esse fim. É multiplataforma e pode enviar notificações automaticamente quando os comandos de execução longa terminam.

Se você possui o Python pip(a maioria das distribuições Linux e MacOS possui), veja como instalá-lo e ativar as notificações automáticas:

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

Confira em http://ntfy.rtfd.io

Além disso, também pode:

  • suprimir notificações automáticas quando o terminal estiver em primeiro plano (X11, iTerm2 e Terminal.app suportado e ativado por padrão)
  • enviar notificações baseadas na nuvem (Pushover, Pushbullet e XMPP)
  • ser usado para enviar notificações quando um processo terminar (não o suporte automático mencionado acima)
  • enviar notificações manualmente (bom para uso em scripts!)

Bem em você. Esta é realmente a resposta mais útil.
Adam Bittlingmayer

Concordo. Eu o uso para exibir uma notificação na minha área de trabalho e enviar a notificação para o meu telefone ao mesmo tempo.
Michael

3

Para o Linux, há um truque bacana para fazer isso automaticamente, sem a necessidade de digitar um comando para notificação sempre.

Primeiro instale o autokey. Isso ajuda a definir ações para diferentes pressionamentos de tecla.

sudo apt-get install autokey-gtk

Agora, defina uma nova frase na tecla automática e atribua a tecla de atalho como Alt + Enter. Adicione esta frase:

; notify-send "Job finished!" &
  #

Observe que uma nova linha após a primeira é importante.

Além disso, adicione um filtro de janela. Eu uso guake e terminal. Inclua qualquer outro terminal que você use.

.*(guake)|(Terminal).*

Você Terminou!!

Agora, sempre que precisar receber notificações para um comando, execute-o usando Alt + Enter em vez de Enter / Return.

Fonte: http://dotpad.blogspot.in/2014/12/notification-when-command-finished.html


3

Embora outras respostas já abranjam a maioria das maneiras de obter notificações de um trabalho concluído, quero dar meus dois centavos desde que você fez sua pergunta no seguinte formato:

O local em que trabalho possui comandos que levam muito tempo para serem executados.

Eu tenho o mesmo problema. Às vezes, algo pode durar 15 minutos.

Eu tenho a seguinte função no meu .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
}

Isso usa o aplicativo Pushover para enviar uma notificação para o meu telefone. Dessa forma, posso almoçar ou entrar em uma reunião e ainda ser notificado sobre os trabalhos que iniciei no computador antes de sair.

Eu o uso da seguinte maneira:

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

Portanto, se o comando retornar um código de saída correto, o primeiro push será executado. Em caso de erro, o segundo será executado.

Ofc, você precisa criar um usuário no Pushover e registrar um aplicativo para enviar notificações em https://pushover.net/

espero que isso tenha ajudado!


OK, então "pushover" é um serviço da web que envia notificações para telefones com o aplicativo "pushover" instalado?
Edward Falk

11
é um serviço da web que envia notificações para telefones, computadores e tudo mais com um navegador da web moderno . Assim, você pode abrir o pushover no seu PC e telefone e ser notificado em todos os dispositivos. limpo, hein? :-)
Thatkookooguy

1

Se você usar csh ou tcsh como seu shell interativo, poderá usar o notifycomando:

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

Você pode obter um efeito semelhante ao bash com set -bou set -o notify.

Provavelmente isso não atende aos seus requisitos, pois tudo o que faz é imprimir uma mensagem; Acho que não pode ser configurado para abrir uma janela ou tocar a campainha.


Estou tentando evitar olhar para a concha para descobrir se um trabalho terminou. Obrigado, no entanto!
Utkarsh Sinha 11/10


1

Se você estiver usando npm, o node-notifier fornece uma solução de plataforma cruzada .

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

Pré-visualização

  • Linux KDE

Linux KDE

  • janelas

janelas

  • Mac OS

Mac

  • Rosnar

Rosnar


1

Gostaria de ter notado essa discussão anos atrás. Minha solução era essencialmente a mesma que a do slhck, mas escrevi um script. Eu uso isso o tempo todo. Postando aqui para compartilhá-lo.

#!/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

Uma pequena explicação: a sequência "\x1b]0;$msg\a"é a sequência de escape ANSI para colocar a mensagem na barra de título da janela da qual foi executada. Às vezes, acho bastante útil ver de qual janela foi a origem da mensagem.




Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.