Как я могу вызвать уведомление, когда работа / процесс заканчивается?


86

В месте, где я работаю, есть команды, выполнение которых занимает много времени.

Есть ли команда / утилита, которую я могу использовать, чтобы уведомить меня об окончании выполнения команды? Это может быть всплывающее окно или небольшой звук.


1
Принятый ответ @ slhck крутой - я должен был понять, что fg;say "Job finished"это сработает. Но ... есть ли способ, которым это может быть дополнительно автоматизировано - т.е. позвонить в звонок или уведомить после завершения любой работы, которая занимает больше порога, например, минуту? Существует ли переменная оболочки, например, в bash, по истечении времени последней команды?
Крейзи Глеу

... через 2 часа обнаружил stackoverflow.com/questions/1862510/… ... put '(($ timer_show> $ {LONG_RUNTIME: -300})) && сказать "долгое задание выполнено" в timer_stop ... затем добавьте в команды компиляции emacs ... и оповестите мои часы Pebble (я ненавижу телефонные уведомления)
Крейзи Глью

Ответы:


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, вызываемое из командной строки. См. Также этот вопрос переполнения стека: отображение окна сообщения из скрипта bash в linux . Его можно установить через ваш любимый менеджер пакетов.

    zenity --info --text="Job finished"
    
  • Некоторые дистрибутивы могут иметь xmessage. Специально для сред GTK, есть gxmessage.

  • В средах рабочего стола, которые реализуют Спецификацию уведомлений рабочего стола , таких как Ubuntu и GNOME , есть система уведомлений, с которой вы можете запускать notify-send(часть libnotify).

    notify-send "Job finished!"
    
  • KDE использует kdialog, например:

    kdialog --passivepopup 'Job finished'
    

Дайте мне знать, какую команду вы использовали! Я добавил несколько других вариантов.
slhck

Я возлюсь с уведомлением-отправкой и xmessage. Оба они кажутся интересными! Вот следующая вещь, которую я ищу - superuser.com/questions/345463/…
Utkarsh Sinha

2
в Mac OS X вы также можете использовать утилиту командной строки «скажем». Есть также много доступных голосов, проверьте «скажи -h»;)
тринадцатое

1
Почему вы предлагаете, чтобы «команда после» выполнялась асинхронно? Вы хотели сказать (command; command-after) &?
G-Man

Это решение предназначено для пользователей Konsole и не является идеальным решением, поскольку оно полагается на то, что ваша команда либо многословна, пока она не завершена, либо полностью молчит (без вывода), пока не завершится, и в этот момент приглашение возвращается. Тем не менее, это именно то, что мне было нужно, когда я пришел за помощью. Вы можете настроить Konsole на всплывающее уведомление, воспроизведение звука и т. Д. Затем необходимо включить мониторинг оболочки. Следите за тишиной, если ваша команда выводит кучу материала, пока не завершится, или за молчанием, если она ничего не распечатывает, а затем оболочка возвращается.
MrMas

20

В Unix-подобных системах вы можете позвонить в звуковой звонок:

echo -e "\a"

Это действительно полезно в дополнение к уведомлению о сообщении на Mac
Sirens

2
так же, какtput bel
Дуайт Спенсер


5

Для получения звукового уведомления вы можете использовать spd-say "Some text". Пример:

some-command; spd-say "Yo"

Какая ОС? Я не вижу этого на Mac или Ubuntu
Эдвард Фальк,

@EdwardFalk Я использую Ubuntu
milkovsky

Хорошо, я использую довольно старую версию, так что, возможно, она в более новых версиях.
Эдвард Фальк

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 поддерживаются и включены по умолчанию)
  • отправлять облачные уведомления (Pushover, Pushbullet и XMPP)
  • использоваться для отправки уведомлений о завершении процесса (не упомянутая выше автоматическая поддержка)
  • отправлять уведомления вручную (хорошо для использования в скриптах!)

Хорошо тебе. Это действительно самый полезный ответ.
Адам Биттлингмайер

Я согласен. Я использую его для отображения уведомления на рабочем столе и одновременно отправляю уведомление на телефон.
Майкл

3

Для Linux есть изящная хитрость, которая делает это автоматически без необходимости каждый раз вводить команду для уведомления.

Сначала установите автоключ. Это помогает определить действия для различных нажатий клавиш.

sudo apt-get install autokey-gtk

Теперь определите новую фразу в autokey и назначьте горячую клавишу как Alt + Enter. Добавьте эту фразу:

; notify-send "Job finished!" &
  #

Обратите внимание, что новая строка после первой строки важна.

Также добавьте оконный фильтр. Я использую гуаке и терминал. Включите любой другой терминал, который вы используете.

.*(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/

надеюсь, это помогло!


Итак, pushover - это веб-служба, которая отправляет уведомления на телефоны с установленным приложением pushover?
Эдвард Фальк,

1
это веб-служба, которая отправляет уведомления на телефоны, компьютеры и все остальное с помощью современного веб-браузера . Таким образом, вы можете открыть pushover на своем ПК и телефоне и получать уведомления на всех устройствах. аккуратно, а? :-)
Thatkookooguy

1

Если вы используете csh или tcsh в качестве интерактивной оболочки, вы можете использовать notifyкоманду:

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

Вы можете добиться аналогичного эффекта в bash с помощью set -bили set -o notify.

Это, вероятно, не соответствует вашим требованиям, поскольку все, что он делает, это печатает сообщение; Я не думаю, что он может быть настроен для всплывающего окна или звонка.


Я стараюсь не смотреть на раковину, чтобы узнать, закончена ли работа. Спасибо хоть!
Уткарш Синха


1

Если вы используете, npmто Node-Notifier предоставляет кроссплатформенное решение .

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

  • Windows

Windows

  • Mac OS

макинтош

  • рычание

рычание


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"является escape-последовательностью ANSI для помещения сообщения в строку заголовка окна, из которого оно было выполнено. Мне иногда бывает удобно видеть, из какого окна пришло сообщение.


1

Так что это происходит довольно поздно, но я начал использовать систему для этого: у меня есть скрипт bash, который выполняет любую команду, переданную ему впоследствии

http://somesh.io/2017/02/19/get-notified-when-long-commands-are-done-executing-on-ubuntu/

#!/bin/bash


# file location : /usr/bin/n

set +e


# $@ executes whatever command is typed after the filename

$@


notify-send "Task Completed"

а потом я просто добавляю n

n bundle install
n npm install

0

Другая возможность заключается в использовании alert, работает на Linux.

>any-command; alert

Выдает уведомление как на картинке. оповещение


0

Я сделал приложение, которое отправит уведомление на ваш телефон Android, когда процесс завершится, чтобы вам не пришлось привязываться к компьютеру.

Установите, затем добавьте ;notifier.shв конец вашей команды.

Например, если ваша команда была make install, вы бы сделали свою команду:

make install; notifier.sh

https://notifier.sh

https://play.google.com/store/apps/details?id=sh.notifier

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.