Como receber uma notificação quando meus comandos são concluídos


64

Estou executando uma série de comandos na linha de comando que leva aproximadamente vinte minutos para ser concluída. Eu gostaria de ver algum tipo de notificação no meu Mac quando terminar, para que não precise monitorar o terminal quando ele terminar. Existe uma maneira de fazer isso?

$ svn update . && ant clean build start && *notify_me_somehow*

Editar :

Eu poderia usar, xclockmas isso parece um hack. Idealmente, eu poderia enviar a notificação para qualquer lugar, como meu telefone, tela etc.


2
Embora você esteja na linha de comando, acho que a resposta aqui é realmente específica para Mac e não para Unix / Linux. Isso porque eu acho que você provavelmente deseja usar Growl e grownlnotify.

Isso não é uma construção em comando, pelo menos na minha caixa.

growl.info Growl é o programa referido por @mattdm.
Jsbillings # 02/03

Respostas:


58

(svn update . && ant clean build start && say done) || say error


11
Este é um exemplo maravilhoso de uso de operadores de shell &&para encadear vários comandos e envolvê-lo com um coletivo ||ou instrução para gerar um erro. +1 na verdade
bmike

2
Agradável! Para ser capaz de fazer isso rapidamente, porém, eu desistir da informação sucesso de erro vs. e acrescentou um apelido global para o meu zsh: alias -g sd='; say done'. Isso significa que eu só tenho que adicionar sda qualquer comando e serei notificado.
wrtsprt

Agradável. e agora eu tenho algo para brincar
Marco Prins

Tentativa e ambos, feito e erro, estão sempre sendo ditos :( Exemplo:(echo alik && echo Orly && say done) || say error
AlikElzin-kilaka

11
Muito conveniente. Eu tenho ecoado com o say -v Zarvoxque faz todos na vizinhança pularem, esta é uma notificação um pouco menos alarmante.
Siddhartha

52

No Mac OS 10.8, você pode enviar mensagens do Centro de Notificação (semelhante ao Growl, mas incorporado ao Mac OS).

Confira " Enviar um alerta para o Centro de Notificação a partir da Linha de Comando no OS X " para ver como instalar uma gema Ruby que permitirá enviar notificações a partir da linha de comando. Para simplificar o caso de uso comum de apenas se preocupar com o fato de algo no terminal estar sendo feito, adicione um alias ao seu .bash_profile:

alias notifyDone='terminal-notifier -title "Terminal" -message "Done with task!"'

Então você pode simplesmente fazer:

$ <long-running task> ; notifyDone

Depois que a tarefa de longa execução terminar, você terá um bom pop-up modal que persiste até você clicar nela:

Pop-up da Central de Notificações


10
terminal notificador pode ser instalado via homebrew , também: brew install terminal-notifier. Então você pode apenas escrever myCommand && terminal-notifier -message 'finished'. Testado no OS X Yosemite (10.10.1).
Pwdr #

4
Você deve executar, myCommand; terminal-notifier -message 'finished'caso contrário, a notificação não será mostrada se myCommandfalhar.
aheuermann

11
Solução incrível! A propósito, isso não produz nenhum som como outras notificações do OS X. Alguma solução para isso?
Sexy Beast

11
@Cupidvogel, você pode apenas adicionar um saycomando, por exemplo my command ; terminal-notifier -message 'finished' ; say finished
Tom Crockett

2
Várias respostas a esta pergunta lotes dar mais detalhes: apple.stackexchange.com/questions/57412/...
Joshua Goldberg

20

Use Growl .

No .dmgarquivo, procure os extras, há um binário de notificação de crescimento. Instale-o, algo como o /usr/local/bin. Então você pode usar este comando

growlnotify --sticky --appIcon <icon> --message <message> -t <title>

para mostrar um pop-up, assim:

rosnar


2
Eu uso quase essa abordagem exata, mas estendo o Growl com o Prowl para que o Growl possa enviar a notificação para o meu iPhone.
Ian C.

3
O Centro de Notificação do Mountain Lion torna o Growl desnecessário ... veja minha resposta sobre como usá-lo para isso.
Tom Crockett

16

No Mac OS X Lion 10.7, o Terminal possui alguns novos indicadores de status para ajudar em problemas como este:

Nas guias:

  • Atividade: um indicador de atividade (indicador de progresso giratório) é exibido quando há uma saída recente para o terminal. Isso permite que você veja se está ocupado ou se concluiu um longo processo. (Ou, é claro, você pode usá-lo para saber quando começou a produzir resultados depois de realizar um trabalho silencioso por um tempo.)

  • Não lida: uma elipse "…" é exibida para indicar texto novo não lido nas guias de plano de fundo. Quando você seleciona a guia, o indicador é apagado.

  • Alerta: uma "campainha" é exibida para indicar quando uma BEL foi gravada nas guias ou janelas de segundo plano. Além disso, o Terminal exibe um emblema vermelho no ícone do aplicativo, indicando o número de alertas / campainhas "não lidas" em todos os terminais. Se o próprio terminal estiver em segundo plano, ele também retornará o ícone do Dock quando uma campainha for tocada.

Na janela minimizada Ícones do Dock:

  • Atividade: a atividade é indicada exibindo o nome do processo em primeiro plano.

  • Não lido: o texto não lido é indicado com reticências.

  • Janelas de terminal minimizadas mostram conteúdo ao vivo em seus ícones do Dock. Isso pode ser usado para verificar se há atividade ou mesmo para determinar o que o terminal está fazendo, se a saída que você procura é identificável (por exemplo, uma exibição "superior" é bastante fácil de reconhecer, mesmo em tamanhos pequenos). Isso é especialmente útil quando a ampliação do Dock está ativada ou você tem espaço para um Dock grande.

Além disso, você pode exibir algo no terminal para chamar sua atenção (o que seria visível mesmo em janelas minimizadas). Por exemplo:

  • Exiba um asterisco grande: banner \*

  • Inverta a exibição: printf '\e[?5h'

  • Pinte a tela de vermelho: tput setab 1; tput clear

  • Sente-se em um loop, piscando na tela: while true; do printf '\e[?5h'; sleep 1; printf '\e[?5l'; sleep 1; done

Também existem códigos de escape para manipular janelas (mover, definir tamanho, zoom, minimizar etc.). Você pode ampliar a janela do Terminal, por exemplo:

printf '\e[9;1t'

Veja "manipulação de janelas" em http://invisible-island.net/xterm/ctlseqs/ctlseqs.html para obter detalhes.

Outra abordagem é usar o AppleScript para exibir um alerta em uma janela separada:

osascript -e 'tell app "System Events" to display alert "Build Completed" message "The checkout and build have completed."'

Excelente uso de tput e seqüências de escape - você tem tudo, exceto uma mensagem de rolagem na barra de título!
bmike

12

Sei que estou atrasado para a pergunta, mas acho que há uma pequena peça que pode ser útil. Descobri que, apesar de agradável, ter seu terminal conversando com você não é exatamente funcional. O melhor é algo mais sutil como este:

http://i.stack.imgur.com/FaZmF.png

Como Chris apontou, Lion adicionou poucos emblemas de notificação quando um BEL é lançado. Você pode jogar isso sozinho com o comando:

tput bel

Portanto, se você estiver trabalhando em segundo plano e quiser uma notificação quando terminar, tente algo como:

ping -c 5 www.google.com && tput bel &

Isso executa o comando ping como uma tarefa em segundo plano (o travamento e o faz) e gera um alerta simples quando termina. Historicamente, o BEL foi usado para emitir esse bip [horrível] de hardware, no entanto, o Lion substituiu com bom gosto o efeito sonoro "comando inválido", um distintivo de notificação e o ícone do terminal saltando duas vezes no dock.


11
printf '\a'seria equivalente a tput bel. Observe que o Terminal não retorna o ícone do Dock se a guia que causou o alerta estiver ativa no momento.
Lri

5

Apresento nesta resposta duas coisas:

  • A opção de usar afplay, que reproduz arquivos de som , para notificação.
  • minhas ferramentas para relatar o status de saída junto com a notificação.

Eu tenho esse script ~/bin/donebeep:

#!/bin/bash
if [ "$@" = 0 ]; then
  afplay -v 2 /System/Library/Sounds/Blow.aiff &
else
  afplay -v 2 /System/Library/Sounds/Sosumi.aiff &
fi

Isso toca um som diferente, dependendo se o argumento é 0. Então eu tenho um alias:

alias donebeep='(savestatus=$?; ~/bin/donebeep $savestatus "$@"; exit $savestatus)'

(Que eles tenham o mesmo nome é irrelevante e provavelmente uma má ideia.)

Para usá-lo em seu exemplo svn update . && ant clean build start; donebeep,. Observe que estou usando, em ;vez de &&, para que ele possa me notificar sobre falhas e também sobre o sucesso.

Antes de aprenderafplay , costumava sayfalar mensagens. O papel de donebeepfoi desempenhado por este script:

#!/bin/bash
say -v Bruce "Done $(basename "$(pwd)"), $@." &

Este script fala o código de saída diretamente, em vez de ter duas mensagens diferentes. Ele também menciona o nome do diretório atual (para ajudar a esclarecer qual tarefa está concluída) e pode receber um texto adicional para dizer, passando parâmetros para o alias (é por isso que o alias contém "$@"). Observe a trilha &para que você não precise esperar a conclusão do discurso antes de receber um prompt.


A página de manual paraafplay está incompleta; afplay -hlista todas as opções:

Usage:
afplay [option...] audio_file

Options: (may appear before or after arguments)
  {-v | --volume} VOLUME
    set the volume for playback of the file
  {-h | --help}
    print help
  { --leaks}
    run leaks analysis  {-t | --time} TIME
    play for TIME seconds
  {-r | --rate} RATE
    play at playback rate
  {-q | --rQuality} QUALITY
    set the quality used for rate-scaled playback (default is 0 - low quality, 1 - high quality)
  {-d | --debug}
    debug print output

4

Você também pode usar o comando build in say para notificação, por exemplo: say "ant: build: done". Veja: o homem diz no terminal.



1

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!)

1

O iTerm2 possui um mecanismo interno para receber notificações, mas você precisa instalar a Integração de Shell .

Ao iniciar um comando de longa execução, selecione:
Editar> Marcas e anotações> Alertas> Alerta na próxima marca ( ⌥Option+ ⌘Command+ A)

Quando o prompt de comando retornar, você pode selecionar entre:

  • Mostrar caixa de alerta modal
  • Postar notificação (captura de tela de exemplo)


0

O Ubuntu envia o seguinte alias no ~ / .bashrc:

alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

Com isso, você pode fazer coisas como:

make; alert
sleep 10; alert

Talvez haja um equivalente notify-sendno Mac OSX? Eu já vi janelas pop-up semelhantes no Mac e no Ubuntu.


Você está no site da Apple. Para tornar isso uma resposta, por favor, explicar como chegar notify-sendno Mac OS X.
Daniel Beck

4
Concordo que isso é inapropriado, mas achei útil. Cheguei a esta pergunta do Google e minha pergunta original não era específica para Mac. Como o pôster original, eu quero uma maneira de não precisar monitorar meu terminal ao executar um comando que leva muito tempo; Eu só acontecerá a estar usando Ubuntu: /
allyourcode

0

Meu problema com sons e janelas modais é que não sei dizer de onde eles vêm. Atualmente, trabalho com vários espaços e, às vezes, mais de 20 janelas de terminal.

Minha solução é portátil para o lado unix e deve funcionar com qualquer coisa que suporte sequências de escape ansi. Esta solução funciona com o Snow Leopard e provavelmente funcionará com versões mais antigas do terminal.

Linha única em .bash_profile

function watch { $* ; echo -n -e "\033[41m" ;  echo $* DONE ;  date ;  echo -n -e "\033[0m" ; }

Quebrando isso:

$* expands to the original command I want to watch.
first escape sequence changes background color to red
echo repeats the command (with red background, the word DONE.
Running Date tells you when it finished.
last escape resets the terminal to what it was.

Se você não gosta do vermelho, a cor de fundo do código de escape do google ascii. Observe que isso não altera a tela inteira em vermelho, mas apenas qualquer coisa emitida após a conclusão do comando.


0

Eu fiz um script para resolver isso que está aqui . Você não precisa de nenhum software extra para isso. Instalação:
brew install akashaggarwal7/tools/tsay
Uso:
sleep 5; tsay

Sinta-se livre para contribuir!


Motivo para voto negativo?
Akash Agarwal

0

Aqui está minha função bash (basta colocá-la em qualquer lugar no seu ~/.bashrcou ~/.zshrc:

watch(){
  cmd=$@ # Somehow interpolate $@ directly doesn't work.
  $@ && say 'Watch Completed!' && osascript -e "display notification \"Completed: $cmd\" with title \"Watch Alert\""
}

Para usá-lo: watch echo 'hi there'

Você também pode personalizar o som da notificação conforme documentado aqui: https://apple.stackexchange.com/a/115373/9622


0

Eu faço esse tipo de coisa o tempo todo. Minha linha de comando pode parecer

$ rm Gemfile.lock && bin/setup && bundle install --binstubs && say "All"; say "done"

Se os comandos bin/setupe forem bundle installconcluídos com êxito, ouvirei a voz do sistema / ditado dizer "Tudo pronto". Se &&algum dos dois primeiros erros for lançado, a cadeia não será seguida e tudo que ouvirei é "Concluído".


0

Você pode usar o osascriptcomando interno para executar um Apple Script que mostra uma notificação, por exemplo

osascript -e 'display notification "Command done" with title "Your title here"'

Você pode agrupá-lo com um ponto e vírgula simples, por exemplo

your-command ; osascript -e '....'
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.