ジョブ/プロセスが終了したときに通知をトリガーするにはどうすればよいですか?


86

私が働いている場所には、実行に時間がかかるコマンドがあります。

コマンドの実行が終了したときに通知するために使用できるコマンド/ユーティリティはありますか?ポップアップウィンドウまたは小さなサウンドである可能性があります。


1
@slhckの受け入れられた答えはクールです-私はそれfg;say "Job finished"がうまくいくことに気付いたはずです。しかし...さらに自動化できる方法はありますか。つまり、ベルを鳴らしたり、1分などのしきい値を超えるジョブの完了後に通知したりしますか。最後のコマンドの経過時間である、bashなどのシェル変数はありますか?
クレイジーグリュー16年

... 2時間後、stackoverflow.com / questions / 1862510 /…が見つかりました... ... put()次に、emacsのコンパイルコマンドに追加し、Pebbleウォッチに通知します(電話通知が嫌いです)
Krazy Glew

回答:


119

通常、コマンドを実行する前にこれを知っている場合は、次のコマンドで開始できます。

command; command-after &

これは、(終了コードに関係なく)前のコマンドが終了したcommand-after 後に実行されます。&バックグラウンドで起動します。

成功または失敗の終了を気にする場合は、それぞれ以下を使用します。

command && command-after-only-if-success &
command || command-after-only-if-fail &

コマンドが既に開始されている場合、ジョブ制御を使用してコマンドを一時停止し、fg通知と連鎖してフォアグラウンドに戻すことができます。

command
# enter Ctrl-z
fg ; command-after

さて…これから何をしたいのかは、環境によって異なります。

  • 上の任意のシステムのことができます。「リング」端末のベル。実際に動作するシステム(BSDとGNU Linuxなど)によって異なりますが、実行するtput bel必要があります。しかし、今のところ確実にテストできませんでした。詳細については、「ベルを鳴らす」を検索してください。

  • のMac OS Xは、Finderダイアログをポップアップ表示するAppleScriptを使用できます。

    osascript -e 'tell Application "Finder" to display dialog "Job finished" '
    

    あなたはあなたに何かを言わせることができます:

    say "Job finished"
    

    または、Mountain Lionの通知システムを使用できます。

    sudo gem install terminal-notifier # <= only need to do this once
    terminal-notifier -message "Job finished!" -title "Info"
    
  • ではGNOMEzenityコマンドラインから呼び出されたGTKのダイアログボックスを表示することができます。このスタックオーバーフローの質問も参照してください。Linuxのbashスクリプトからのメッセージボックスを表示します。お気に入りのパッケージマネージャーからインストールできます。

    zenity --info --text="Job finished"
    
  • 一部のディストリビューションにはがありますxmessage。特にGTK環境には、がありgxmessageます。

  • UbuntuGNOMEなど、デスクトップ通知仕様を実装するデスクトップ環境には、(の一部)でトリガーできる通知システムがあります。notify-sendlibnotify

    notify-send "Job finished!"
    
  • KDEkdialog、たとえば、を使用します。

    kdialog --passivepopup 'Job finished'
    

使用したコマンドを教えてください!他のオプションもいくつか追加しました。
slhck

私はnotify-sendとxmessageをいじっています。どちらも面白いようです!-ここに私が探している次の事だsuperuser.com/questions/345463/...
Utkarshシンハ

2
Mac OS Xでは、コマンドラインユーティリティ「say」を使用することもできます。);利用可能な多くの声が「-h言う」チェック、またある
trinth

1
「コマンド後」を非同期で実行するように提案するのはなぜですか?と言うつもりでした(command; command-after) &か?
Gマン

このソリューションはKonsoleユーザー向けであり、コマンドが完了するまで冗長であるか、プロンプトが戻る時点で完了するまで完全にサイレント(出力なし)に依存するため、完璧なソリューションではありません。しかし、これはまさに私が助けを探しに来たときに必要だったものです。Konsoleを設定して、通知のポップアップ、サウンドの再生などを行うことができます。その後、シェルモニタリングをオンにする必要があります。コマンドが完了するまで大量のものを出力する場合は無音を監視し、何も出力せずにシェルが戻る場合は無音を監視します。
-MrMas



5

サウンド通知を取得するには、を使用できますspd-say "Some text"。例:

some-command; spd-say "Yo"

OS 私はMacやUbuntuの上でそれを見ていない
エドワード・フォーク

@EdwardFalk私はUbuntuを使用しています
milkovsky

OK、私はかなり古いバージョンを使用しているので、新しいバージョンにある可能性があります。
エドワードフォーク

1
これは単なるテキスト読み上げアプリケーションです。からインストールできsudo apt-get install speech-dispatcherます。または使用の代替案はaskubuntu.com/questions/501910/...
milkovsky

ああ、デフォルトではインストールされていませんか?私はそれについて考えるべきだった。リンクをありがとう。
エドワードフォーク

4

Cygwinからのデスクトップ通知にnotifuを使用し始めたばかりです。これは、Windows用のコマンドライン通知アプリです。

例:

ls -l && /c/notifu-1.6/notifu64 /m "This is a simple Notifu message."

4

私はntfyまさにこの目的のために書きました。それは、クロスプラットフォームとすることができ、自動的に実行時間の長いコマンドが終了したときに通知を送信します。

Pythonをお持ちの場合pip(ほとんどのLinuxディストリビューションとMacOSにあります)、ここにインストールして自動通知を有効にする方法を示します。

$ sudo pip install ntfy
$ echo 'eval "$(ntfy shell-integration)"' >> ~/.bashrc
$ # restart your shell

http://ntfy.rtfd.ioでそれをチェックしてください

それに加えて、次のこともできます。

  • 端末がフォアグラウンドにあるときに自動通知を抑制します(X11、iTerm2、およびTerminal.appはデフォルトでサポートおよび有効化されています)
  • クラウドベースの通知を送信する(プッシュオーバー、プッシュブレット、およびXMPP)
  • プロセスの終了時に通知を送信するために使用されます(前述の自動サポートではありません)
  • 手動で通知を送信します(スクリプトでの使用に適しています!)

よかったね。これは本当に最も有用な答えです。
アダムBittlingmayer

同意する。これを使用してデスクトップに通知を表示し、同時に通知を電話機にプッシュします。
マイケル

3

Linuxの場合、毎回通知用のコマンドを入力することなく、これを自動的に行う巧妙なトリックがあります。

最初にオートキーをインストールします。これは、さまざまなキーストロークのアクションを定義するのに役立ちます。

sudo apt-get install autokey-gtk

次に、オートキーで新しいフレーズを定義し、ホットキーをAlt + Enterとして割り当てます。このフレーズを追加します。

; notify-send "Job finished!" &
  #

最初の行の後の新しい行が重要であることに注意してください。

また、ウィンドウフィルターを追加します。グアケとターミナルを使用しています。使用する他の端末を含めます。

.*(guake)|(Terminal).*

できました!!

これで、コマンドの通知を取得する必要があるたびに、Enter / Returnの代わりにAlt + Enterを使用して実行できます。

ソース:http : //dotpad.blogspot.in/2014/12/notification-when-command-finished.html


3

他の回答はすでに終了した仕事の通知を受け取る方法のほとんどをカバーしていましたが、あなたが次の形式で質問をしたので、私は2セントを与えたいです。

私が働いている場所には、実行に時間がかかるコマンドがあります。

私は同じ問題を抱えています。何かが15分間実行されることもあります。

.bashrcに次の機能があります。

# push a notification to your phone. can be handy if you're running a
# build and you want to be notified when it's finished.
push() {
    curl -s -F "token=PUSHOVER_TOKEN" \
    -F "user=PUSHOVER_USER" \
    -F "title=terminal" \
    -F "message=$1" https://api.pushover.net/1/messages.json > /dev/null 2>&1
}

これは、プッシュオーバーアプリを使用して、通知を電話にプッシュします。このようにして、昼食に行ったり会議に参加したりしても、出発前にコンピューターで開始したジョブの通知を受け取ることができます。

次の方法で使用します。

command_to_run && push "yes! command finished successfully!" || push "awww man! something failed :-("

そのため、コマンドが正しい終了コードを返す場合、最初のプッシュが実行されます。エラーが発生すると、2番目のエラーが実行されます。

プッシュオーバーでユーザーを作成し、アプリを登録してhttps://pushover.net/から通知を送信する必要があり ます

これが役に立てば幸いです!


さて、「プッシュオーバー」は、「プッシュオーバー」アプリがインストールされている電話に通知を送信するWebサービスですか?
エドワードフォーク

1
最新のWebブラウザーを使用して、電話、コンピューターなどに通知を送信するWebサービスです。そのため、PCと電話でプッシュオーバーを開いて、すべてのデバイスで通知を受けることができます。きちんとした、ハァッ?:-)
Thatkookooguy

1

対話型シェルとしてcshまたはtcshを使用する場合、notify次のコマンドを使用できます。

% long-running-command &
[1] 14431
% notify %1
% 
(later, when the command finishes)
[1]    Done                          long-running-command

set -bまたはを使用して、bashで同様の効果を実現できset -o notifyます。

これはおそらくメッセージを出力するだけなので、要件を満たしていません。ウィンドウをポップアップしたり、ベルを鳴らすように設定できるとは思いません。


ジョブが終了したかどうかを確認するためにシェルを見ないようにしています。でもありがとう!
ウトカルシュシンハ


1

使用している場合npmnode-notifierクロスプラットフォームソリューションを提供します。

notify -t "Agent Coulson" --icon https://raw.githubusercontent.com/mikaelbr/node-notifier/master/example/coulson.jpg -m "Well, that's new. "

プレビュー

  • Linux KDE

Linux KDE

窓

  • マックOS

マック

  • うなり声

うなり声


1

何年も前にこのスレッドに気づいたと思います。私のソリューションは基本的にslhckのソリューションと同じでしたが、スクリプトを書きました。いつも使っています。ここに投稿して共有します。

#!/bin/bash

msg='all done'
quiet=false
if [ "$1" = '-q' ]; then quiet=true; shift; fi
if [ $# -gt 0 ]; then msg="$*"; fi

echo -ne "\x1b]0;$msg\a"
if [ -x /usr/bin/zenity ]; then
  unset WINDOWID
  exec zenity --info --text="$msg"
elif [ -x /usr/bin/xmessage ]; then
  exec xmessage -nearmouse "$msg"
elif [ -x /usr/bin/osascript ]; then
  if ! $quiet; then say "done" &; fi
  osascript -e "tell application \"System Events\" to display dialog \"$msg\""
else
  echo $msg
fi

ちょっとした説明:文字列"\x1b]0;$msg\a"は、メッセージが実行されたウィンドウのタイトルバーにメッセージを配置するANSIエスケープシーケンスです。メッセージの送信元のウィンドウを確認できると便利な場合があります。


1

だから、これはかなり遅くなりますが、私はこれを行うためにシステムを使用し始めました:私は後でそれに渡されるコマンドを実行するbashスクリプトを持っています

http://somesh.io/2017/02/19/get-notified-when-long-commands-are-done-executing-on-ubuntu/

#!/bin/bash


# file location : /usr/bin/n

set +e


# $@ executes whatever command is typed after the filename

$@


notify-send "Task Completed"

そして、私は単にnを追加します

n bundle install
n npm install

0

別の可能性はalert、Linux上で動作するを使用することです。

>any-command; alert

画像のように通知します。 アラート通知


0

プロセスの終了時にAndroidスマートフォンに通知を送信するアプリを作成したので、コンピューターに接続する必要はありません。

インストールして;notifier.shから、コマンドの最後に追加します。

たとえば、コマンドがの場合、コマンドmake installを作成します。

make install; notifier.sh

https://notifier.sh

https://play.google.com/store/apps/details?id=sh.notifier

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.