Jak mogę uruchomić powiadomienie, gdy zakończy się zadanie / proces?

86

Miejsce, w którym pracuję, ma polecenia, których wykonanie zajmuje dużo czasu.

Czy istnieje polecenie / narzędzie, którego mogę użyć, aby powiadomić mnie o zakończeniu wykonywania polecenia? Może to być wyskakujące okienko lub dźwięk.

Utkarsh Sinha
źródło
1
Przyjęta odpowiedź @ slhck jest fajna - powinienem był wiedzieć, że fg;say "Job finished"to zadziała. Ale ... czy jest jakiś sposób, aby można go jeszcze zautomatyzować - np. Zadzwonić lub powiadomić po zakończeniu każdego zadania, które zajmuje więcej niż próg, jak minuta? Czy istnieje zmienna powłoki, np. W bash, która upłynęła od ostatniego polecenia?
Krazy Glew
... 2 godziny później znalazłem stackoverflow.com/questions/1862510/ ... ... umieść '(($ timer_show> $ {LONG_RUNTIME: -300})) i& powiedz „zakończono długo działające zadanie” w timer_stop ... następnie dodaj do poleceń kompilacji emacsa ... i powiadom mój zegarek Pebble (nienawidzę powiadomień telefonicznych)
Krazy Glew

Odpowiedzi:

119

Ogólnie rzecz biorąc, jeśli wiesz o tym przed uruchomieniem polecenia, możesz po prostu uruchomić go za pomocą:

command; command-after &

Spowoduje to wykonanie polecenia command-after po wyjściu z poprzedniego polecenia (niezależnie od kodu wyjścia). &Rozpocznie go w tle.

Jeśli zależy Ci na pomyślnym lub nieudanym wyjściu, użyj odpowiednio:

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

Jeśli polecenie już się rozpoczęło, możesz użyć kontroli zadań, aby go zawiesić, a następnie powrócić na pierwszy plan z fgłańcuchem z powiadomieniem:

command
# enter Ctrl-z
fg ; command-after

Teraz ... to, co chcesz zrobić, zależy od twojego środowiska.

  • W dowolnym systemie można „zadzwonić” dzwonkiem terminala . Zależy od twojego systemu, co naprawdę działa (BSD vs. GNU Linux itp.), Ale tput belpowinno działać. Jednak nie mogłem tego teraz niezawodnie przetestować. Wyszukaj „dzwonek”, aby dowiedzieć się więcej.

  • W systemie Mac OS X można użyć AppleScript, aby wyświetlić okno dialogowe Findera:

    osascript -e 'tell Application "Finder" to display dialog "Job finished" '
    

    Mógłbyś powiedzieć coś do ciebie:

    say "Job finished"
    

    Lub możesz skorzystać z systemu powiadomień Mountain Lion:

    sudo gem install terminal-notifier # <= only need to do this once
    terminal-notifier -message "Job finished!" -title "Info"
    
  • W GNOME , zenitymoże pokazać się okno dialogowe GTK, zwany z wiersza poleceń. Zobacz także pytanie Przepełnienie stosu: wyświetlanie okna komunikatu ze skryptu bash w systemie Linux . Można go zainstalować za pomocą ulubionego menedżera pakietów.

    zenity --info --text="Job finished"
    
  • Niektóre dystrybucje mogą mieć xmessage. Jest specjalnie dla środowisk GTK gxmessage.

  • W środowiskach pulpitu, które implementują specyfikację powiadomień pulpitu , takich jak Ubuntu i GNOME , istnieje system powiadomień, który można uruchamiać za pomocą notify-send(części libnotify).

    notify-send "Job finished!"
    
  • KDE używa kdialogna przykład:

    kdialog --passivepopup 'Job finished'
    
slhck
źródło
Daj mi znać, jakiego polecenia użyłeś! Dodałem też kilka innych opcji.
slhck 11.10.11
Bawię się wysyłaniem powiadomień i wysyłaniem wiadomości. Oba wydają się interesujące! Oto kolejna rzecz, której szukam - superuser.com/questions/345463/...
Utkarsh Sinha,
2
w systemie Mac OS X można również użyć narzędzia wiersza polecenia „say”. dostępnych jest również wiele głosów, zaznacz „say -h”;)
piąta 10.10
1
Dlaczego sugerujesz, że polecenie „po poleceniu” powinno być uruchamiane asynchronicznie? Czy chciałeś powiedzieć (command; command-after) &?
G-Man,
To rozwiązanie jest przeznaczone dla użytkowników Konsoli i nie jest idealnym rozwiązaniem, ponieważ polega na tym, że twoje polecenie jest pełne, dopóki nie zostanie ukończone, lub całkowicie ciche (brak danych wyjściowych), dopóki nie zakończy się, w którym to momencie powraca monit. Jednak tego właśnie potrzebowałem, kiedy szukałem pomocy. Możesz skonfigurować Konsolę, aby wyświetlała powiadomienie, odtwarzała dźwięk itp. Następnie musisz włączyć monitorowanie powłoki. Monitoruj ciszę, jeśli twoje polecenie generuje wiele rzeczy, dopóki się nie zakończy, lub wycisz, jeśli nic nie wydrukuje, a następnie powłoka powróci.
MrMas
20

W systemach uniksowych możesz zadzwonić dźwiękiem:

echo -e "\a"
trinth
źródło
Jest to naprawdę przydatne w uzupełnieniu powiadomienia o wiadomości na komputerze Mac
Sirens
2
tak samo jaktput bel
Dwight Spencer,
5

Aby uzyskać powiadomienie dźwiękowe, możesz użyć spd-say "Some text". Przykład:

some-command; spd-say "Yo"
Milkovsky
źródło
Jaki system operacyjny Nie widzę tego na komputerach Mac i Ubuntu
Edward Falk
@EdwardFalk Używam Ubuntu
milkovsky
OK, używam dość starej wersji, więc może jest w nowszych wersjach.
Edward Falk,
1
To tylko aplikacja zamiany tekstu na mowę. Możesz go zainstalować za pośrednictwem sudo apt-get install speech-dispatcher. Lub skorzystaj z alternatywy askubuntu.com/questions/501910/…
milkovsky
Ahh, domyślnie nie zainstalowany? Powinienem o tym pomyśleć. Dzięki za link.
Edward Falk,
4

Właśnie zacząłem używać notifu do powiadomień na pulpicie od Cygwin. Jest to aplikacja do powiadamiania z wiersza poleceń dla systemu Windows.

Przykład:

ls -l && /c/notifu-1.6/notifu64 /m "This is a simple Notifu message."
Ashutosh Jindal
źródło
4

Napisałem ntfywłaśnie w tym celu. Jest wieloplatformowy i może automatycznie wysyłać powiadomienia po zakończeniu długotrwałych poleceń.

Jeśli masz Pythona pip(większość dystrybucji Linuksa i MacOS to ma), oto jak go zainstalować i włączyć automatyczne powiadomienia:

$ sudo pip install ntfy
$ echo 'eval "$(ntfy shell-integration)"' >> ~/.bashrc
$ # restart your shell

Sprawdź to na http://ntfy.rtfd.io

Oprócz tego może również:

  • ukrywa automatyczne powiadomienia, gdy terminal jest na pierwszym planie (X11, iTerm2 i Terminal.app są obsługiwane i domyślnie włączone)
  • wysyłać powiadomienia w chmurze (Pushover, Pushbullet i XMPP)
  • być używany do wysyłania powiadomień o zakończeniu procesu (nie wspomniane automatyczne wsparcie)
  • ręcznie wysyłać powiadomienia (dobre do użycia w skryptach!)
Daniel Schep
źródło
Dobrze dla ciebie. To naprawdę najbardziej użyteczna odpowiedź.
Adam Bittlingmayer,
Zgadzam się. Używam go, aby wyświetlać powiadomienie na pulpicie i jednocześnie przesyłać powiadomienie do telefonu.
Michael,
3

W przypadku Linuksa jest sprytna sztuczka, aby to zrobić automatycznie, bez konieczności wpisywania polecenia za każdym razem.

Najpierw zainstaluj autokey. Pomaga to zdefiniować działania dla różnych naciśnięć klawiszy.

sudo apt-get install autokey-gtk

Teraz zdefiniuj nową frazę w autokey i przypisz skrót klawiszowy jako Alt + Enter. Dodaj tę frazę:

; notify-send "Job finished!" &
  #

Zauważ, że nowa linia po pierwszej linii jest ważna.

Dodaj także filtr okna. Używam guake i terminalu. Uwzględnij dowolny inny używany terminal.

.*(guake)|(Terminal).*

Jesteś skończony!!

Teraz za każdym razem, gdy potrzebujesz powiadomień o poleceniu, uruchom je za pomocą Alt + Enter zamiast Enter / Return.

Źródło: http://dotpad.blogspot.in/2014/12/notification-when-command-finished.html

Shivams
źródło
3

Chociaż inne odpowiedzi już obejmowały większość sposobów otrzymywania powiadomień o ukończonej pracy, chcę dać moje dwa centy, ponieważ zadałeś pytanie w następującym formacie:

Miejsce, w którym pracuję, ma polecenia, których wykonanie zajmuje dużo czasu.

Mam ten sam problem. Czasami coś może działać przez 15 minut.

Mam następującą funkcję w moim .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
}

Korzysta z aplikacji Pushover, aby przesłać powiadomienie na mój telefon. W ten sposób mogę iść na lunch lub wziąć udział w spotkaniu i nadal otrzymywać powiadomienia o zadaniach rozpoczętych na komputerze przed wyjazdem.

Używam go w następujący sposób:

command_to_run && push "yes! command finished successfully!" || push "awww man! something failed :-("

Tak więc, jeśli polecenie zwróci prawidłowy kod wyjścia, zostanie wykonane pierwsze wypchnięcie. W przypadku błędu zostanie wykonany drugi.

Często musisz utworzyć użytkownika w Pushover i zarejestrować aplikację, aby wysyłać powiadomienia z https://pushover.net/

mam nadzieję, że to pomogło!

Thatkookooguy
źródło
OK, więc „pushover” to usługa internetowa, która wysyła powiadomienia do telefonów z zainstalowaną aplikacją „pushover”?
Edward Falk,
1
to usługa internetowa, która wysyła powiadomienia na telefony, komputery i wszystko za pomocą nowoczesnej przeglądarki internetowej . Możesz więc mieć otwartą funkcję pushover na komputerze i telefonie i otrzymywać powiadomienia na wszystkich urządzeniach. schludnie, co? :-)
Thatkookooguy,
1

Jeśli używasz csh lub tcsh jako interaktywnej powłoki, możesz użyć notifypolecenia:

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

Możesz osiągnąć podobny efekt w bashu za pomocą set -blub set -o notify.

Prawdopodobnie nie spełnia Twoich wymagań, ponieważ wystarczy wydrukować wiadomość; Nie sądzę, że można to skonfigurować tak, żeby wyskoczyło okno lub zadzwoniło.

Keith Thompson
źródło
Staram się unikać patrzenia na powłokę, aby dowiedzieć się, czy zadanie zostało zakończone. W każdym razie dzięki!
Utkarsh Sinha
1

W systemach z „awk” spróbuj

awk 'BEGIN{ print "\a" }'

był jedynym, który dla mnie pracował.

Krzysztof
źródło
1
To tylko pełny sposób echa \a( odpowiedź Trinth ).
David Richerby,
1

Jeśli używasz, npmto węzeł-powiadomienie zapewnia rozwiązanie dla wielu platform .

notify -t "Agent Coulson" --icon https://raw.githubusercontent.com/mikaelbr/node-notifier/master/example/coulson.jpg -m "Well, that's new. "

Zapowiedź

  • Linux KDE

Linux KDE

  • Windows

Windows

  • System operacyjny Mac

prochowiec

  • Warczeć

Warczeć

Édouard Lopez
źródło
1

Chciałbym zauważyć ten wątek lata temu. Moje rozwiązanie było w zasadzie takie samo jak rozwiązanie slhck, ale napisałem skrypt. Używam tego cały czas. Publikowanie tutaj, aby je udostępnić.

#!/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

Jedno małe wyjaśnienie: ciąg znaków "\x1b]0;$msg\a"jest sekwencją ucieczkową ANSI, która umieszcza komunikat na pasku tytułowym okna, z którego został wykonany. Czasami bardzo mi się przydaje, aby zobaczyć, z którego okna pochodzi wiadomość.

Edward Falk
źródło
0

Inną możliwością jest użycie alert, Działa w systemie Linux.

>any-command; alert

Daje powiadomienie jak na obrazku. powiadomienie o alertach

DTharun
źródło
0

Zrobiłem aplikację, która wyśle ​​powiadomienie na Twój telefon z Androidem, gdy proces się zakończy, więc nie musisz być przywiązany do komputera.

Zainstaluj, a następnie dodaj ;notifier.shna końcu polecenia.

Na przykład, jeśli twoje polecenie było make install, wydasz polecenie:

make install; notifier.sh

https://notifier.sh

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

Jolt151
źródło