Як я можу викликати сповіщення, коли робота / процес закінчується?


86

Місце, в якому я працюю, має команди, які потребують тривалого часу для виконання.

Чи є команда / утиліта, яку я можу використовувати, щоб сповістити мене, коли виконання команди закінчиться? Це може бути спливаюче вікно або, можливо, мало звуку.


1
@ прийнята відповідь slhck - це класно - я мав би зрозуміти, що fg;say "Job finished"це спрацює. Але ... чи є спосіб її подальшого автоматизації - тобто дзвонити в дзвінок або повідомляти після завершення будь-якої роботи, яка займає більше ніж поріг, як хвилина? Чи є змінна оболонки, наприклад у bash, що минув час останньої команди?
Krazy Glew

... 2 години пізніше знайдено stackoverflow.com/questions/1862510/… ... put '(($ timer_show> $ {LONG_RUNTIME: -300})) && скажіть "давно виконана робота виконана"' в timer_stop ... далі, додайте до команд компіляції Emacs ... і повідомте про свій годинник Pebble (я ненавиджу сповіщення по телефону)
Krazy Glew

Відповіді:


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



5

Щоб отримати надійне сповіщення, ви можете використовувати spd-say "Some text". Приклад:

some-command; spd-say "Yo"

Яка ОС? Я не бачу цього на Mac чи Ubuntu
Edward Falk

@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

Тепер визначте нову фразу в автоматичному ключі та призначте гарячу клавішу як Alt + Enter. Додати цю фразу:

; notify-send "Job finished!" &
  #

Зауважте, що новий рядок після першого рядка важливий.

Також додайте фільтр вікон. Я використовую guake та термінал. Включіть будь-який інший термінал, який ви використовуєте.

.*(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 :-("

Отже, якщо команда повертає правильний код виходу, перший натискання буде виконано. При помилці буде виконано друге.

Звичайно, потрібно створити користувача в Pushover і зареєструвати додаток для надсилання сповіщень з https://pushover.net/

сподіваюся, що це допомогло!


Добре, значить, "pushhover" - це веб-служба, яка надсилає сповіщення на телефони, на яких встановлено додаток "pushhover"?
Едвард Фолк

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

1

Якщо ви використовуєте csh або tcsh як свою інтерактивну оболонку, ви можете використовувати notifyкоманду:

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

Ви можете досягти подібного ефекту в баші з set -bабо set -o notify.

Це, ймовірно, не відповідає вашим вимогам, оскільки все, що він робить, це надрукувати повідомлення; Я не думаю, що це може бути налаштовано, щоб спливати вікно чи дзвонити у дзвоник.


Я намагаюся уникати перегляду оболонки, щоб дізнатися, чи закінчена робота. Дякую, хоча!
Utkarsh Sinha


1

Якщо ви використовуєте, npmтоді вузол-сповіщувач забезпечить кросплатформенне рішення .

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"- це послідовність аварійної послідовності 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

Я зробив додаток, який надсилатиме сповіщення на ваш телефон 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.