3

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

Я могу приблизиться к желаемому результату, используя триггер iTerm2. Например, если я запускаю следующее на удаленном сервере и устанавливаю триггер iTerm2 для __FINISHED__:

./long_process && echo "\__FINISHED__"

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

Одним из решений может быть какое-то текстовое уведомление, которое iTerm2 распознает, но оно не появится в буфере обратной прокрутки emacs.

2 ответа2

5

Вы не указали, какое уведомление вы хотите, и какую операционную систему использует удаленный сервер, поэтому я собираюсь сделать некоторые предположения здесь. Я предполагаю, что вам на самом деле все равно, какой тип уведомления, если вы получаете уведомление, и что на удаленном сервере работает какой-то вариант * nix.

  1. Отправьте себе электронное письмо. Если sendmail настроен на сервере, вы можете сделать

    ./long_process && echo "Job done" | sendmail pnj@yourdomain.com
    
  2. ssh вернитесь на свой локальный компьютер (если это возможно) и заставьте его поговорить с вами. Смотрите здесь для более крутых способов сделать OSX звуковой сигнал для вас.

    ./long_process && ssh you@local.ip say "Yo! All done"
    

    или же

    ./long_process && ssh you@local.ip terminal-notifier -message "Job finished!" -title "Info"
    

    Если вы подключаетесь с динамического IP-адреса и настроили свой маршрутизатор так, чтобы вы могли использовать ssh для этого динамического IP-адреса, вы можете сделать это (при условии, что в данный момент вы подключены только с удаленной машины):

    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"
    

    Вы можете установить ssh без пароля обычным способом. На него не должен влиять динамический IP. Как только вы это сделаете, приведенный выше код будет работать.

  3. Используйте pushover и отправьте уведомление на устройство Android или iOS (если оно есть)

    ./long_process && pushover.pl "All done"
    
2

Вы можете echo звонок - \a в удаленном терминале:./long_process ; echo -e '\a'

Некоторые эмуляторы терминала воспроизводят какой-то звук и могут отображать уведомления. В частности, iTerm2 будет показывать уведомление и воспроизводить звук, если вкладка процесса не сфокусирована.

Кроме того, обратите внимание, что я использовал ; разделять команды. Таким образом, вы будете уведомлены, даже когда команда вернет ненулевой статус, а && будет выполняться только в случае успешного выполнения команды.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .