Jak mogę wyzwolić powiadomienie ze zdalnego terminala w OS X

3

Uruchamiam długi proces na zdalnej powłoce. Chciałbym uruchomić powiadomienie po zakończeniu procesu. Ta odpowiedź nie wystarcza, ponieważ długie polecenie znajduje się na serwerze zdalnym, więc nie może wywołać powiadamiania o terminalu.

Mogę zbliżyć się do mojego pożądanego rezultatu, używając wyzwalacza iTerm2. Na przykład jeśli uruchomię następujące polecenie na serwerze zdalnym i ustawię wyzwalacz iTerm2 dla __FINISHED__:

./long_process && echo "\__FINISHED__"

Ma to niepożądaną cechę, że za każdym razem, gdy przewijam do tego polecenia w moim edytorze lub moim kodzie (używam kodu w powłoce emacsa), powiadomienie uruchamia się.

Jednym rozwiązaniem może być powiadomienie tekstowe rozpoznawane przez iTerm2, ale nie pojawi się ono w buforze przewijania emacsa.

pnj
źródło
echo "__FIN""ISHED__"
grawity
W połowie drogi - zapobiega powiadomieniom, gdy przewijam mój kod, ale nie zapobiega niepożądanym powiadomieniom, jeśli przewijam okno wyjściowe.
pnj

Odpowiedzi:

4

Nie określiłeś, jakiego rodzaju powiadamiania chcesz, ani jakiego systemu operacyjnego działa zdalny serwer, więc będę musiał poczynić tutaj pewne założenia. Zakładam, że nie obchodzi cię, jaki typ powiadomienia jest tak długo, jak długo jesteś powiadamiany, i że zdalny serwer działa z pewnym zapachem * nix.

  1. Wyślij sobie e-mail. Jeśli sendmail jest skonfigurowany na serwerze, możesz to zrobić

    ./long_process && echo "Job done" | sendmail [email protected]
    
  2. ssh z powrotem na lokalną maszynę (zakładając, że jest to możliwe) i spraw, aby z tobą rozmawiał. Widzieć tutaj po więcej fajnych sposobów na uzyskanie sygnału OSX.

    ./long_process && ssh [email protected] say "Yo! All done"
    

    lub

    ./long_process && ssh [email protected] terminal-notifier -message "Job finished!" -title "Info"
    

    Jeśli łączysz się z dynamicznego adresu IP i skonfigurowałeś router tak, abyś mógł ssh do tego dynamicznego adresu IP, możesz to zrobić (zakładając, że jesteś aktualnie połączony tylko ze zdalnym komputerem):

    ip=$(who | grep $USER | perl -lne 's/\\((.+?)\\)\s*$//; print "$1"' | tail -n 1) &&
     ./long_process && ssh you@$ip terminal-notifier -message "Job finished!" -title "Info"
    

    Możesz ustawić ssh bez hasła w normalny sposób . Dynamiczny adres IP nie powinien mieć na niego wpływu. Gdy to zrobisz, powyższy kod zadziała.

  3. Posługiwać się łatwizna i wyślij powiadomienie na urządzenie z Androidem lub iOS (jeśli je masz)

    ./long_process && pushover.pl "All done"
    
terdon
źródło
Za pomocą say ponad SSH jest naprawdę fajny na komputerach Mac.
slhck
@hlhck heh, tak, przeczytałem to :).
terdon
# 2 to koncepcja, której szukam, ale lokalna maszyna to laptop i ma dynamiczny adres IP. Idealnie chciałbym mieć coś takiego jak powiadamiający terminal, tj. Małe, ciche okno podręczne. Nawet jeśli zdalna powłoka zna proces odradzania się, nie jestem pewien, jak działa ssh bez wprowadzania hasła za każdym razem, biorąc pod uwagę dynamiczne IP.
pnj
@pnj zobacz zaktualizowaną odpowiedź.
terdon
@terdon, który to robi, po naprawieniu ukośników odwrotnych w wyrażeniu perla, które zjadł superużytkownik.
pnj
2

Możesz echo dzwon - \a na zdalnym terminalu: ./long_process ; echo -e '\a'

Niektóre emulatory terminali zagrają jakiś dźwięk i mogą wyświetlać powiadomienia. W szczególności iTerm2 wyświetli powiadomienie i odtworzy dźwięk, jeśli karta procesu nie jest skupiona.

Zauważ też, że użyłem ; oddzielić polecenia. W ten sposób będziesz powiadamiany nawet wtedy, gdy komenda zwróci status niezerowy && będzie działać tylko wtedy, gdy polecenie się powiedzie.

KarolisL
źródło