Уведомление рабочего стола при завершении длинных команд

Вы можете запустить процесс в фоновом режиме с помощью Ampersand (& amp;). Например,

sh example.sh &

будет запускать сценарий example.sh в фоновом режиме. Затем вы можете безопасно выйти из системы и вернуться позже, чтобы проверить, завершен ли сценарий.

1
задан 5 May 2017 в 06:46

8 ответов

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

wrapper(){
    start=$(date +%s)
    "$@"
    [ $(($(date +%s) - start)) -le 15 ] || notify-send "Notification" "Long\
 running command \"$(echo $@)\" took $(($(date +%s) - start)) seconds to finish"
}

Скопируйте эту функцию в свои ~/.bashrc и источник ~/.bashrc as,

. ~/.bashrc

Использование

wrapper <your_command>

Если потребуется больше (! d5)

Использование

wrapper sudo apt-get update

wrapper sudo apt-get update

30
ответ дан 24 May 2018 в 12:38
  • 1
    "$@", а не $@. Большая разница. – geirha 24 January 2014 в 01:31
  • 2
    Я бы хотел избежать записи wrapper перед каждой введенной мной командой. – aioobe 24 January 2014 в 01:58
  • 3
    @aioobe вы можете использовать более короткое имя функции, даже может быть буквой. но обертка работает таким образом. – souravc 24 January 2014 в 03:05
  • 4
    command; alert на самом деле короче wrapper command :-) – aioobe 8 May 2015 в 18:19
  • 5
    Если вы не хотите, чтобы notify-send истекал в течение длительного времени, дайте уведомление - отправьте пользовательский тайм-аут (в миллисекундах). например [F2] – Bryce Guinta 5 April 2017 в 02:49

В ~/.bashrc имеется псевдоним alert, определенный как:

alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

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

Использование: 2]

$ the_command; alert

, например

$ sudo apt-get update; alert

Вы можете настроить псевдоним в соответствии с вашими потребностями и желаниями.

23
ответ дан 24 May 2018 в 12:38
  • 1
    Это приятно знать. Есть ли способ добавить предупреждение после каждой команды, которую я набираю (а также иметь предупреждение только в том случае, если команда заняла более 15 секунд)? – aioobe 24 January 2014 в 01:59
  • 2
    странная вещь, она уже добавлена ​​в мой .bashrc, это по умолчанию в ubuntu? – Vignesh 5 December 2017 в 13:47

Помимо предлагаемой обертки, такой как souravc, в bash нет хорошего способа сделать это. Вы можете взломать его с помощью ловушки DEBUG и PROMPT_COMMAND. Ловушка DEBUG запускается всякий раз, когда вы запускаете команду, а PROMPT_COMMAND запускается непосредственно перед написанием приглашения.

Итак, материал для ~/.bashrc становится чем-то вроде

trap '_start=$SECONDS' DEBUG
PROMPT_COMMAND='(if (( SECONDS - _start > 15 )); then notify-send "Long running command ended"; fi)'

. Это хак, так что не удивляйтесь, если вы столкнетесь с нечетными побочными эффектами.

13
ответ дан 24 May 2018 в 12:38

EDIT

EDIT : создать ярлык автозаполнения в .inputrc и функцию в .bashrc. Запустите команду, как обычно, введите, но вместо ENTER нажмите комбинацию клавиш, указанную вами в .inputrc

. Человек, который разместил щедрость по этому вопросу, сказал:

«Все существующие ответы требуют ввода дополнительной команды после команды. Мне нужен ответ, который делает это автоматически ».

При исследовании решений этой проблемы я наткнулся на этот вопрос из stackexchange, что позволяет привязать ENTER J к последовательности команд: Ctrla (переход к началу строки) , поместите строку «mesure» перед введенной командой, Ctrlm (выполнить)

Таким образом, вы получаете функциональность автозаполнения и отдельную команду J для измерения времени, в то время как сохранение первоначальное назначение второй функции, которую я написал ниже.

На данный момент вот содержимое моего файла ~/.inputrc:

"\C-j": "\C-a measure \C-m"

И вот содержимое .bashrc (примечание , Я не использовал bash навсегда - я использую mksh как свою оболочку, следовательно, это то, что вы видите в исходном сообщении. Функциональность все та же)

PS1=' serg@ubuntu [$(pwd)]
================================
$ '
function measure () 
{

/usr/bin/time --output="/home/xieerqi/.timefile" -f "%e" $@ 

if [ $( cat ~/.timefile| cut -d'.' -f1 ) -gt 15 ]; then

    notify-send "Hi , $@ is done !"

fi


}

Оригинальная запись

Вот моя идея - используйте функцию в .bashrc. Основной принцип - используйте /usr/bin/time для измерения времени, которое требуется для завершения команды, и если оно более 15 секунд, отправьте уведомление.

function measure () 
{

if [ $( /usr/bin/time -f "%e" $@ 2>&1 >/dev/null ) -gt 15 ]; then

    notify-send "Hi , $@ is done !"

fi


}

Здесь я перенаправляю вывод на /dev/null, но для просмотра вывода также можно перенаправить файл.

Гораздо лучший подход, IMHO, заключается в отправке вывода времени в какой-либо файл в вашей домашней папке (просто чтобы вы не загрязняли свою систему таймифами и всегда знали, где искать). Вот вторая версия

function measure () 
{

/usr/bin/time --output=~/.timefile -f "%e" $@ 

if [ $( cat ~/.timefile | cut -d'.' -f1 ) -gt 15 ]; then

    notify-send "Hi , $@ is done !"

fi


}

И вот скриншоты первой и второй версий, в этом порядке

Первая версия, нет выхода

Вторая версия, с выход enter image description here

4
ответ дан 24 May 2018 в 12:38
  • 1
    Кстати, работает и с командами sudo. Я тестировал его с помощью sudo lsof и в основном с ping -c20 google.com. – Sergiy Kolodyazhnyy 4 May 2015 в 05:19

Недавно я создал инструмент, который служит этой цели. Его можно запускать как оболочку или автоматически с помощью интеграции оболочки. Проверьте это здесь: http://ntfy.rtfd.io

Чтобы установить его:

sudo pip install ntfy

Использовать его в качестве обертки:

ntfy done sleep 3
4] Чтобы получать уведомления автоматически, добавьте это в свои .bashrc или .zshrc:

eval "$(ntfy shell-integration)"
3
ответ дан 24 May 2018 в 12:38

Ваш скрипт работает достаточно хорошо, просто убедитесь, что вы включили строку «shebang» (#!/bin/bash). Здесь упоминаются другие #!/bin/bash, но большую часть времени #!/bin/bash отлично работает для сценариев Unix bash.

Это похоже на тестовый скрипт:

#!/bin/bash
start=$(date +%s);
   echo Started
   sleep 20;
   echo Finished!
[ $(($(date +%s) - start)) -le 15 ] || notify-send -i dialog-warning-symbolic "Header" "Message"

Чтобы изменить этот скрипт, поставьте команды echo и sleep.

Обратите внимание на notify-send, вы можете использовать -i для указания значка: -)

[d9 ] Кроме того, убедитесь, что он выполним, выполнив сначала chmod +x /PATH/TO/FILE.

1
ответ дан 24 May 2018 в 12:38

Вы можете изменить Bash, чтобы реализовать функциональность оболочки.

Если вы склонны делать много таких изменений в своей интерактивной оболочке, вы можете подумать о переходе на внутреннюю взломанную оболочку, такую ​​как eshell, которая построен с использованием Emacs elisp и имеет все свои легендарные возможности:

http://www.masteringemacs.org/articles/2010/12/13/complete-guide-mastering-eshell/

1
ответ дан 24 May 2018 в 12:38

Вы также можете сделать это с помощью простого оператора if

#!/bin/bash

START=$(date +%s)

TIME=$(($START+15))

ORIGINAL_COMMAND;

END=$(date +%s)

if [ $END -gt $TIME ]
then
    notify-send "Task Completed"
fi

Вы можете использовать свои собственные имена переменных.

Я могу подтвердить, что это работает, я тестировал с помощью команда, которая занимает много времени, а другая - нет, и уведомление приходит за долгое время

Вы также можете сделать это с помощью любой команды, заменив ORIGINAL_COMMAND на $@ и запуск сценария как ./script command.

-2
ответ дан 24 May 2018 в 12:38
  • 1
    Почему мой ответ был опущен? Я хочу знать, где я ошибся в ответе – Rumesh 3 May 2015 в 19:46
  • 2
    Я не уменьшил его, но я скажу вам, что с ним не так: прежде всего, это требует ввода дополнительной команды. Я конкретно заявил в своей щедрости, что не хочу этого делать. Во-вторых, зачем вычислять? $((2+2)) является встроенным bash, не требует дополнительных программ. В-третьих: он не работает с командами с пробелами. tl; dr: это хуже, чем другие 1-летние ответы – Galgalesh 3 May 2015 в 21:44
  • 3
    Хорошо ..... время начала и окончания всегда будет другим, не так ли? Даже для короткой команды, длительностью 1 секунда – Sergiy Kolodyazhnyy 5 March 2016 в 03:11

Другие вопросы по тегам:

Похожие вопросы: