リモートプロセス完了通知(ただし、電子メールは提供されません)

リモートプロセス完了通知(ただし、電子メールは提供されません)

私はOpenSSHを使用してLinuxサーバーに接続しており、サーバーでtmux長い時間がかかるコンパイル操作を実行するセッションがあります。これで、長い時間がかかるコマンドが最終的に完了したら、Linuxクライアント(接続されたコンピュータ)からすぐに通知を受けたいと思います。

ローカルではポップアップの使い方、再生方法などを知っています。(1)、(2)特定のコマンドを実行して通知を受け取ります。これで、リモートで同じことを行う必要があります。完璧なソリューションは一種のフィードバックチャネルですが、ssh私はそのような機能を全く知りません。

そして(3)で提案されたEメールベースのソリューションを使用しないでください。私はすでに仕事用の電子メールをあまりにも受け取っており、読んで、保存、転送、返信するのではなく、確認用の電子メールの数を減らそうとしています。 (私はこれを行うために別々の電子メールアカウントを作成しました。リアルタイムの通知を受け取ることはできません)。


  1. https://superuser.com/questions/345447/how-can-i-trigger-a-notification-when-a-job-process-ends
  2. https://askubuntu.com/questions/277215/make-a-sound-once-process-is-complete
  3. 実行中のプロセスが完了したら通知

答え1

SSH接続がまだ存在する場合はそれを使用できますport forwarding。 2台のコンピュータを呼び出します。そのうちlaptopserver後者は長期実行ジョブを実行しています。私の考えでは、これの最大の利点は、コーヒーショップからラップトップに接続するのと同じ一時的な設定にあると思います。このユースケースでは、NATの背後で実行され、PNPを使用してポートを開くことができない可能性があります。通常、サーバーに何もインストールする必要はありません。これが適用されない場合は、ノートブックのSSHサービス設定に関するアドバイスに従ってください。

ラップトップからSSHを呼び出し、リモートTCPポート4000をローカルポート5000に転送するように要求します。実際、両端で同じポート番号を使用します。私は何が起こっているのかをより明確にするために別のポート番号を使用しました。ここではopensshコマンドラインを使用します。

ssh -R 4000:127.0.0.1:5000 username@server

tmux に接続してジョブを開始し、完了したらポート 4000 に書き込むように長期実行ジョブをスケジュールします。

(long_running job with params ; echo "$?" > /dev/tcp/127.0.0.1/4000) &

/dev/tcpがなく、シェルでエミュレートされていない場合は、次のようなものを使用できます。echo "$?" | netcat 127.0.0.1 4000

同時に、ラップトップはおそらく別のウィンドウでポート5000の接続を受信して​​います。

netcat -l -p 5000; do_something_to_alert_the_local_user.

netcatは、サーバーが暗号化されたSSHトンネルを介してポート5000に転送されるポート4000に接続するのを待つことをブロックします。エコー終了時に接続を閉じるとローカルがnetcat終了し、do_something_to_alert_the_local_user が実行されます。

答え2

最も簡単な解決策は、tmuxを使用して終了し、tmux detachを実行してssh接続を閉じ、通知を送信して再接続してtmuxに再接続することです。たとえば、スクリプトを使用すると、

ssh -t remote tmux
notify-send done
ssh -t remote tmux attach

tmux を実行し、長期実行コマンドを開始し、あらかじめコマンドを入力します。

tmux detach

長いコマンドが完了すると実行されます。これにより、tmuxが閉じ、SSHが閉じ、通知を送信するとデスクトップメッセージが表示されます。新しいSSHは中断した場所に正確に再接続されます。

答え3

@icarus の解決策についてフォローアップするには、代わりに次のコマンドを使用します。

echo "$?" | netcat 127.0.0.1 4000 -q 0

それ以外の場合、netcatは無期限に待機し、接続を閉じません。または、SSHホストからローカルホストにデータを転送したい場合は、次のように受信できます。

SUM=$(netcat -l -p 5000); notify-send $SUM

答え4

クライアントでOpenSSHサーバーを実行している場合は、特定のキーに対して特定のコマンドを実行するように構成できます。正しく完了すると、このキーはこの通知をトリガーするためにのみ使用でき、明らかに邪悪な操作には使用できません。

混乱を軽減するために(この場合、両方ともクライアントまたはサーバーの操作を実行するため)、長いタスクを開始するためにリモートサーバーに接続するクライアントであるローカルシステムを呼び出します。アリス単発その後、サーバーはそこでコンパイル操作を開始し、Aliceはサーバーからタスクの完了に関する通知を受け取ります。

これを行うには、デフォルトでキー生成を使用してからssh-keygen -f notif_key公開キー(notif_key.pub)を別の行にAliceに追加します.ssh/authorized_keys。ただし、前には以下が追加されます。

command="/path/to/notifier.sh \"$SSH_ORIGINAL_COMMAND\"",no-port-forwarding,no-x11-forwarding,no-agent-forwarding ssh-rsa …

ssh-rsa …公開鍵を示します。)

notifier.shはAlice側のスクリプトで、通知コマンドを呼び出します(もちろん、可能であればすぐに起動できます。行全体がシェルで実行されることに注意してください)。

その後、Bob側で次を使用してAlice側で通知をトリガーsshできますtmux

time-consuming-command; ssh -i notif_key user@alice_pc foobar

それだけです!

これは、forceコマンドに渡される$SSH_ORIGINAL_COMMANDコマンドのすべての追加のコマンドラインのプレースホルダです。sshたとえば、この方法で複数のタスクを同時に実行するときにBobの特定の通知をカスタマイズできます。

notifier.shこれを念頭に置いた例:

#!/bin/sh
some-notification-command --message "Task '$*' is done!"
echo 'Note to Bob: Alice has been notified.'

全体的に、このソリューションは最適とは異なります。クライアントにOpenSSHサーバーが必要で、設定が非常に面倒です。より良い解決策があることを願っています。

関連情報