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


O local onde eu trabalho tem comandos que demoram muito para serem executados.

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


82


origem


A resposta aceita do @shhck é legal - eu deveria ter percebido que fg;say "Job finished" podia funcionar. Mas ... existe alguma maneira que possa ser automatizada - ou seja, tocar a campainha ou notificar após a conclusão de qualquer trabalho que demore mais do que um limiar como um minuto? Existe uma variável shell, por ex. no bash, que é o tempo decorrido do último comando? - Krazy Glew
... 2 horas depois, encontrado stackoverflow.com/questions/1862510/… ... coloque '(($ timer_show> $ {LONG_RUNTIME: -300})) && diga "trabalho de longa duração concluído"' em timer_stop ... a seguir, adicione comandos de compilação do emacs ... e notifique meu relógio Pebble ( Eu odeio notificações por telefone) - Krazy Glew


Respostas:


Geralmente, se você sabe disso antes executando o comando, você pode apenas iniciá-lo com:

command; command-after &

Isto irá executar o command-after  depois de o comando anterior saiu (independentemente do seu código de saída). o & vai começar em segundo plano.

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

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

Se o comando tiver  iniciado você pode usar o controle de trabalho para suspendê-lo, em seguida, devolvê-lo para o primeiro plano com fg encadeado 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 "toque" o sino terminal. Depende do seu sistema exato o que realmente funciona (BSD vs. GNU Linux, etc.), mas tput bel deveria fazer. Eu não poderia testá-lo de forma confiável agora, no entanto. Procure por "campainha" para saber mais.

  • Em Mac OS X, você poderia 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 da Mountain Lion:

    sudo gem install terminal-notifier # <= only need to do this once
    terminal-notifier -message "Job finished!" -title "Info"
    
  • Dentro GNOMO, zenity pode mostrar uma caixa de diálogo GTK, chamada a partir da linha de comando. Veja também esta pergunta 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.

  • Ubuntu tem um sistema de notificação que você pode acionar com notify-send.

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

    kdialog --passivepopup 'Job finished'
    

112



Deixe-me saber o comando que você usou! Eu adicionei algumas outras opções também. - slhck
Estou mexendo com o notify-send e o xmessage. Ambos parecem interessantes! Aqui está a próxima coisa que estou procurando - superuser.com/questions/345463/… - Utkarsh Sinha
no Mac OS X, você também pode usar o utilitário de linha de comando "say". há também muitas vozes disponíveis, marque "say -h";) - trinth
Excelente resposta! - SunnyShah
Por que você está sugerindo que o comando "após" deve ser executado de forma assíncrona? Você quis dizer (command; command-after) &? - G-Man


Em sistemas unix-like você pode tocar o sino sonoro:

echo -e "\a"

19



Isso é realmente útil, além de uma notificação de mensagem no mac - Sirens
igual a tput bel - Dwight Spencer


Eu criei uma ferramenta simples, para o MacOS X, que faz exatamente isso. https://github.com/vikfroberg/brb

Instalação

$ npm install -g brb

Instruções

$ sleep 3; brb

8





Acabei de começar a usar notifu para notificações de desktop do Cygwin. É um aplicativo de notificação de linha de comando para o Windows.

Exemplo:

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

4





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

some-command; spd-say "Yo"

4



Qual sistema operacional? Eu não vejo isso no Mac ou no Ubuntu - Edward Falk
@EdwardFalk Eu estou usando o Ubuntu - milkovsky
Ok, estou usando uma versão bem antiga, então talvez seja em versões mais novas. - Edward Falk
É apenas um aplicativo de texto para fala. Você pode instalá-lo via sudo apt-get install speech-dispatcher. Ou use alternativas askubuntu.com/questions/501910/… - milkovsky
Ahh, não instalado por padrão? Eu deveria ter pensado sobre isso. Obrigado pelo link. - Edward Falk


Para o Linux, existe um truque bacana para fazer isso automaticamente sem ter que digitar um comando para notificação toda vez.

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

sudo apt-get install autokey-gtk

Agora, defina uma nova frase no autokey e atribua a tecla de atalho como Alt + Enter. Adicione esta frase:

; notify-send "Job finished!" &
  #

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

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

.*(guake)|(Terminal).*

Você está feito!!

Agora, sempre que precisar receber notificações de 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á cobrem a maioria das formas de receber notificações em um trabalho concluído, quero dar meus dois centavos desde que você fez sua pergunta no seguinte formato:

O local onde eu trabalho tem comandos que demoram muito para serem executados.

Eu tenho o mesmo problema. Às vezes, algo pode ser executado por 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 ao meu telefone. Dessa forma, posso ir almoçar ou participar de uma reunião e ainda ser notificado sobre os trabalhos que iniciei no computador antes de sair.

Eu 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 um erro, o segundo será executado.

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

Espero que isso tenha ajudado!


3



OK, então "pushover" é um serviço da web que envia notificações para telefones que têm o aplicativo "pushover" instalado? - Edward Falk
é um serviço da web que envia notificações para telefones, computadores e tudo mais com um navegador da web moderno. Assim, você pode ter pushover aberto no seu PC e telefone e ser notificado em todos os dispositivos. puro, né? :-) - Thatkookooguy


eu escrevi ntfy exatamente para esse propósito. Isto é plataforma cruzada e pode automaticamente enviar notificações quando comandos de longa execução terminarem.

Se você tem o Python pip (a maioria das distribuições Linux e MacOS tem), aqui está 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 está em primeiro plano (X11, iTerm2 e Terminal.app suportado e ativado por padrão)
  • enviar notificações baseadas em nuvem (Pushover, Pushbullet e XMPP)
  • ser usado para enviar notificações quando um processo termina (não o suporte automático mencionado anteriormente)
  • manualmente enviar notificações (bom para uso em scripts!)

3



Bem em você. Esta é realmente a resposta mais útil. - A. M. Bittlingmayer
Concordo. Eu uso para exibir uma notificação na minha área de trabalho e enviar a notificação para o meu telefone ao mesmo tempo. - Michael


Se você usa csh ou tcsh como seu shell interativo, você pode usar o notify comando:

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

Você pode conseguir um efeito similar no bash com set -b ou set -o notify.

Isso provavelmente não atende aos seus requisitos, já que tudo o que faz é imprimir uma mensagem; Eu não acho que pode ser configurado para abrir uma janela ou tocar a campainha.


1



Eu estou tentando evitar olhar para o shell para descobrir se um trabalho terminou. Obrigado, embora! - Utkarsh Sinha