Вы можете запустить процесс в фоновом режиме с помощью Ampersand (& amp;). Например,
sh example.sh &
будет запускать сценарий example.sh в фоновом режиме. Затем вы можете безопасно выйти из системы и вернуться позже, чтобы проверить, завершен ли сценарий.
Насколько я понял, вы хотите обертку. И вы хотите использовать команду через него, чтобы он дал вам желаемое уведомление, если время выполнения вашей команды больше 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
В ~/.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
Вы можете настроить псевдоним в соответствии с вашими потребностями и желаниями.
Помимо предлагаемой обертки, такой как 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)'
. Это хак, так что не удивляйтесь, если вы столкнетесь с нечетными побочными эффектами.
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
}
И вот скриншоты первой и второй версий, в этом порядке
Первая версия, нет выхода
Вторая версия, с выход
Недавно я создал инструмент, который служит этой цели. Его можно запускать как оболочку или автоматически с помощью интеграции оболочки. Проверьте это здесь: http://ntfy.rtfd.io
Чтобы установить его:
sudo pip install ntfy
Использовать его в качестве обертки:
ntfy done sleep 3
4] Чтобы получать уведомления автоматически, добавьте это в свои .bashrc или .zshrc: eval "$(ntfy shell-integration)"
Ваш скрипт работает достаточно хорошо, просто убедитесь, что вы включили строку «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.Вы можете изменить Bash, чтобы реализовать функциональность оболочки.
Если вы склонны делать много таких изменений в своей интерактивной оболочке, вы можете подумать о переходе на внутреннюю взломанную оболочку, такую как eshell, которая построен с использованием Emacs elisp и имеет все свои легендарные возможности:
http://www.masteringemacs.org/articles/2010/12/13/complete-guide-mastering-eshell/
Вы также можете сделать это с помощью простого оператора 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.