SSHで長いタスクが完了したら警告を送信する方法は?

SSHで長いタスクが完了したら警告を送信する方法は?

notify-send私のデスクトップはUbuntuで、デスクトップに警告を表示する便利なプログラムがあります。また、以下の便利なエイリアスが組み込まれています。

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

つまり、 を実行しvery-long-running-command; alert、端末をバックグラウンドで実行し、タスクが完了すると通知を受け取ることができます。

SSH経由でCentOSサーバーに接続すると、状況が少し難しくなります。 1つの方法は次のとおりです。

localhost$ ssh [email protected]; alert
example.net$ very-long-running-command; exit

これはある程度動作しますが、各コマンドの後で終了することは通常私が望むものではありません。

マイコンピュータにスピーカーはありません。ビープ音が鳴ります。

ベストアンサー1

私が考える最も簡単な方法は、2番目のSSHセッションを使用して名前付きFIFOを渡すことです。私はtmp/あなたのホームディレクトリに1つがあると仮定します。 FIFOを好きな場所に自由に保管してください。

local$ ssh me@remotehost 'mkfifo ~/tmp/alert_fifo ; while cat ~/tmp/alert_fifo ; do : ; done' | \
    while read icon_name text ; do
        notify_send --urgency=low -i "$icon_name" "$text"
    done &

その後、実際のタスクを実行するために、2番目のSSHセッションを開いている間にバックグラウンドで実行することができます。

local$ ssh me@remotehost
remote$ alias remote_alert='echo ... >~/tmp/alert_fifo'
remote$ long_running_command; remote_alert

...ここでremote_alert変更されたalertエイリアスは、notify_send --urgency=low -iFIFOに内容を反映して置き換えられます。

これは、リモートシステムで最小限のツールセット(sshおよび標準のPOSIXユーティリティのみを使用)を使用します。ただし、FIFOを使用すると、リーダーを実行するのを忘れた場合(またはリーダーが死んだ場合)、作成者は中断されます。したがって、少し時間があれば、socatより寛大にすることができます。

local$ ssh me@remotehost 'socat UNIX-RECV:~/tmp/alert_socket -' | \
    while read ...
        ...
    done &

local$ ssh me@remotehost
remote$ alias remote_alert='echo ... | socat - UNIX-SEND:~/tmp/alert_socket'

おすすめ記事