Уведомления Growl для завершения задачи оболочки

4758
ezrock

(OSX Specific)

Я, как и многие другие, кроме себя, часто запускаю процесс в оболочке, выполнение которого занимает минуту или две (например, большой коммит svn). В течение этого времени я часто alt-tab и обновляю reddit / slashdot / wikipedia / что угодно. Было бы замечательно настроить что-то, что будет публиковать уведомление о рычании, когда процесс оболочки завершится.

В моем идеальном мире это будет работать так: «Если процесс только что вышел из вкладки, открытой в Терминале, отправьте уведомление о рычании».

У кого-нибудь еще есть что-то подобное?

12
Обратите внимание, что рычание будет уведомлять вас, только если вы все еще сидите на экране. Для более длинных программ используйте команду «say», чтобы получить звуковую подсказку о завершении. 14 лет назад 1
@mankoff: Вы можете настроить параметры уведомлений приложения «growlnotify» в «Growl.prefPane», чтобы включить звук звукового уведомления. Однако он не может изменяться в зависимости от выполняемой команды, как, скажем, `say`. Но это менее жутко. Daniel Beck 14 лет назад 0

8 ответов на вопрос

11
Daniel Beck

Вы можете установить growlnotify, чтобы сделать это.

$ ./some_program && growlnotify Title -m Message

Конечно, вам нужно подумать об этом перед выполнением команды. Альтернативой (хотя я не знаю, как этого добиться) было бы уведомление Growl для каждой команды, что было бы безумно раздражающим.


Чтобы упростить использование growlnotify для вашего варианта использования, отредактируйте ~/bash_profileи добавьте следующее:

function long { $@ /usr/local/bin/growlnotify Finished -m 'Done' } 

теперь вы можете просто long your_command(похоже sudo). Ctrl-Aпомещает курсор в начало строки, если вы (как и я) всегда сначала набираете фактическую команду, а потом должны добавить префикс.

К сожалению, моего bash-fu недостаточно для добавления команды к growlnotifyсообщению.


за комментарий @ mankoff к этому ответу:

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

function gn { /usr/local/bin/growlnotify Finished -m "$@" } 

Используйте как gn svn.

Вам не нужно думать об этом перед командой. Если, пока он работает, вы понимаете, что хотите получить уведомление, когда это будет сделано, просто наберите «gn foo» (или «say done», для звуковых подсказок), нажмите enter, и эта команда будет выполнена, когда закончится текущая. , 14 лет назад 2
Вы прокомментируете это автоматически? Используйте PS1 или что-то еще, чтобы коснуться отметки времени. Используйте PS2, чтобы проверить, как долго PS1 коснулся его. Если прошло> n секунд, запустите growlnotify. Теперь это не раздражает, потому что это происходит не для каждой команды. 14 лет назад 0
@mankoff Правда. Так что простая функция для уменьшения набора текста достаточно. Daniel Beck 14 лет назад 0
@mankoff PS2? Разве это не просто подсказка продолжения? Это не префикс каждой строки вывода ..? Daniel Beck 14 лет назад 0
PS1 / PS2 были просто догадками, как места, которые я бы начал искать, если бы хотел реализовать это. Возможно, все это можно встроить только в PS1. И, возможно, есть совершенно разные способы сделать общую настройку рычагов для каждой команды. 14 лет назад 0
Ну, что касается времени, я думаю, что оценка даты по сравнению с датой, когда была выполнена команда, должна работать. Для меня я не собираюсь делать эту часть, я думаю, потому что просто выполнение функции 'gn' и вызов ее после длинной команды работает хорошо. ezrock 13 лет назад 0
Я наткнулся на загадку, хотя. Какой идентификатор я ssh'd где-то еще. Например, я ssh'd на удаленной машине и запускаю задание резервного копирования. Я не могу сделать $ [user @ remotemachine] backup.sh; Г-н, потому что, ну, г-н не будет работать таким образом. Правильно? Идеи? ezrock 13 лет назад 0
@ezrock yes, потому что команда **, которую выполняет ваша машина **, конечно же, ssh. Проверьте [эту статью] (http://bruce.pennypacker.org/2009/12/23/sending-messages-to-growl-remotely-for-irssi-integration/) для удаленного выполнения этого. Daniel Beck 13 лет назад 0
Недостатком функции является то, что она не будет работать при выполнении псевдонима, поскольку псевдоним не раскрывается внутри функции. Например, запуск `gn ll` будет утверждать, что` ll` не является известной командой. nwinkler 12 лет назад 0
@nwinkler `man bash` утверждает, что практически для любых целей псевдонимы заменяются функциями. Неудивительно, что если бы `ы` были функцией, это бы сработало. Daniel Beck 12 лет назад 0
2
roguesys

Что вам нужно, так это то, growlnotifyчто CLI-программа запускает уведомления о рычании. Вы можете использовать его как:

./script.sh;; growlnotify -m "done" 

У него есть еще несколько ручек, с которыми вы можете играть, используйте growlnotify -hдля получения дополнительной информации

Благодарю. Я просто прокомментировал в то же время, когда я тоже это нашел. Точка с запятой имеет больше смысла, чем &&. ezrock 14 лет назад 0
@ezrock Я полагаю, что можно использовать `&&` и `||`, чтобы иметь разные сообщения между состояниями успеха и сбоя, но если кто-то заинтересован только в том, чтобы сообщение отображалось после выполнения команды, то `;;` защищен от ошибок. знак равно roguesys 14 лет назад 1
2
bmucklow

Изменение ответа Даниэля Бека, если вы сделаете это небольшое изменение, сделает его очень приятным.

function long { command=$@ $command /usr/local/bin/growlnotify Finished -m "$command completed." } 

Затем, когда вы запустите 'long svn up', вы увидите сообщение 'svn up complete'.

Очень хорошо, если вы запускаете много трудоемких сценариев оболочки одновременно.

2
ezrock

Now that OSX 10.8 and later has native notifications, this is how I accomplish the same goal via terminal-notifier:

  1. Install brew
  2. $ brew install terminal-notifier
  3. Add this to ~/.bash_profile:

    function gn { terminal-notifier -message ' ' -title 'Finished' } 

Make sure that you have sourced your profile with . ~/.bash_profile (not necessary for future terminal sessions), since your profile is sourced automatically when creating a session.

Test with your favorite command, followed by the function call.

ls ; gn 

The arguments to terminal-notifier can stand some improving, but a quick attempt of grabbing the previous command to pass to the function wasn't successful and this gets me all of the functionality that I need. Namely, adding ;gn to get a notification at the end of any long-running process.

1
fideli

Используйте Growlnotify .

ls && growlnotify -H localhost -m "message" 
1
Kristian Domagala

Это способ его автоматического вызова для «долго выполняющихся» процессов: http://hints.macworld.com/article.php?story=20071009124425468

Он подключается $PROMPT_COMMANDи уведомляет о завершении процессов, которые занимают более 10 секунд. Возможно, вам придется настроить его в соответствии с вашей собственной средой и рабочим процессом (например, игнорируя завершение lessили вызов редактора), но, похоже, он работает достаточно хорошо из коробки.

Я сам не пробовал, но полностью автоматизированный подход звучит очень привлекательно. Все остальные решения здесь требуют заранее знать, что команда будет работать долго, и помнить о необходимости запуска скрипта (т. Е. Ls; growlnotify). Мне нравится идея, что нет необходимости вручную его запускать. ezrock 10 лет назад 0
0
ezrock

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

  1. Установите growlnotify (он находится в папке extras для установочной загрузки Growl) 1.
  2. Добавить < && growlnotify -m "Message"> к длинному процессу.

Это работает для меня прямо сейчас, но я мог бы сделать лучше, я думаю.

0
stiemannkj1

Решение OSX 10.9+ без стороннего программного обеспечения:

В OSX 10.9 и выше вы можете использовать команду AppleScript, display notificationчтобы отобразить рычание с терминала, например:

osascript -e 'display notification with title "Process Completed."' 

Если вы не хотите вводить все это каждый раз, вы можете использовать alias:

alias growl='osascript -e "display notification with title \"Process Completed.\""' 

Пример:

long-running-script.sh; growl