web-dev-qa-db-ja.com

長時間実行されているコマンドが完了したときのデスクトップ通知

たとえば、15秒以上実行されたコマンドが対話型シェルで終了するたびにデスクトップ通知を受け取りたいです。

言い換えれば、私はすべてのコマンドがこのようなものに包まれることを望みます

start=$(date +%s);
ORIGINAL_COMMAND;
[ $(($(date +%s) - start)) -le 15 ] || notify-send "Long running command finished"

これをbashで達成する最良の方法は何ですか?

57
aioobe

https://launchpad.net/undistract-me (UbuntuアーカイブからSudo apt-get install undistract-meでインストール可能)、自動での作業(つまり、長時間実行される可能性のあるコマンドに何かを追加することを忘れずに)。

23
sil

私の知る限り、 wrapper が必要です。また、コマンドの実行時間が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にこの関数をコピーして、

. ~/.bashrc

使用法

wrapper <your_command>

15秒以上かかる場合は、コマンドとその実行時間を説明するデスクトップ通知が表示されます。

wrapper Sudo apt-get update

screenshot of desktop-nitification

32
souravc

~/.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$//'\'')"'

コマンド実行の完了を通知するために使用できます。

使用法:

$ the_command; alert

例えば.

$ Sudo apt-get update; alert

snap1

エイリアスは、必要に応じてカスタマイズできます。

26
precise

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
geirha

編集

TL; DR.inputrcにオートコンプリートショートカットを作成し、.bashrcに関数を作成します。通常どおりコマンドを実行し、入力しますが、代わりに ENTER.inputrcで指定したショートカットを押します

この質問に賞金をかけた人は言った:

「既存の回答はすべて、コマンドの後に追加のコマンドを入力する必要があります。これを自動的に行う回答が必要です。」

この問題の解決策を研究している間、私はつまずきました this stackexchangeからの質問。 CtrlJ コマンドのシーケンスへ: Ctrla (行の先頭に移動)、入力したコマンドの前に「mesure」文字列を配置し、 Ctrlm (実行)

したがって、オートコンプリートの機能と個別の ENTER second関数の本来の目的を維持しながら、時間を測定するコマンドは、以下に掲載されています。

今のところ、私の~/.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は、時間の出力をホームフォルダー内のファイルに送信することです(タイムファイルでシステムを汚染せず、常にどこを見ればよいかを常に把握できるようにします)。これがその2番目のバージョンです

function measure () 
{

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

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

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

fi


}

そして、最初と2番目のバージョンのスクリーンショットを、この順序で示します

最初のバージョン、出力なし enter image description here

2番目のバージョン、出力あり enter image description here

4

この目的に役立つツールを最近作成しました。ラッパーとして実行するか、シェル統合で自動的に実行できます。こちらをご覧ください: http://ntfy.rtfd.io

それをインストールするには:

Sudo pip install ntfy

ラッパーとして使用するには:

ntfy done sleep 3

通知を自動的に取得するには、これを.bashrcまたは.zshrcに追加します。

eval "$(ntfy Shell-integration)"
3
Daniel Schep

Bashを変更して、必要なラッパー機能を実装できます。

対話型シェルにこのような多くの変更を加える場合は、Emacs elispを使用して構築され、カスタマイズ性が高いeshellのような本質的にハッキング可能なシェルへの切り替えを検討できます。

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

1
Ryan Prior

スクリプトは非常にうまく機能します。 '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を使用してアイコンも指定できます:-)

また、最初にchmod +x /PATH/TO/FILEを実行して、実行可能であることを確認してください。

1
Wilf