席を外しても安心!WSLプログラム終了をWindows通知で確認する方法

WSL音声認識機械学習のトレーニングなど、長時間かかるプログラムを実行していると、「いつ終わったか分からない」という問題が発生します。席を外している間に終わっていた、なんてこともしばしばあります🥲せっかくなら、プログラムの終了時に通知が来ると便利ですよね。昔もしばしばビープ音を鳴らしていましたが、音に気づかないことも多く、あまり効果的ではありませんでした。

本記事では、プログラム自体を修正せずに、終了時に音声を鳴らす方法やWindowsのトースト通知を表示させる方法を紹介します。 トースト通知はアクションセンターに履歴が残るため、席を外していても後から確認できるのが大きな利点です😊

今回取り扱う環境

今回は以下のような環境を取り扱います。ビープ音を鳴らす方法は他のLinux環境でも応用可能です。また、トースト通知の方法はWindows環境でもPowerShellから同様に利用できます。

  • Windows11(PowerShell) … 実行可能な場合には🪟
  • WSL2 (Ubuntu) … 実行可能な場合には🐧

🐧方法1: シンプルなコマンド連結(手軽に試したい場合)

最もシンプルな音を鳴らす方法はビープ音を鳴らすことです。 実行の終了時にビープ音を鳴らす方法は、コマンド(プログラム)の末尾に;で連結して、ビープ音を鳴らすコマンドを実行することです。

実行させるプログラムがyour_programの場合、以下のようにします。

# プログラム終了後にビープ音
$ your_program ; echo -e '\a'

# 複数回鳴らす
$ your_program ; for i in {1..5}; do echo -e '\a'; sleep 0.5; done

ただし、ビープ音は環境によって鳴らないこともありますし、音が小さくて気づきにくいという問題があります。 また、ターミナルで音をオフっていることもあるので、それにも注意です。

🐧🪟方法2: Windowsの音声ファイルを再生

WSLからPowerShellを呼び出して、Windows側の音声ファイルを再生できます。 実行させるプログラムがyour_programの場合、以下のように実行します。 この例では、プログラム終了後にWindowsの標準音声ファイル(C:\Windows\Media\Ring01.wav)を再生しています。

# WSLの場合(;で連結)
$ your_program ; powershell.exe -c '(New-Object Media.SoundPlayer "C:\Windows\Media\Ring01.wav").PlaySync()'

# PowerShellの場合(;で連結)
PS> your_program ; powershell.exe -c '(New-Object Media.SoundPlayer "C:\Windows\Media\Ring01.wav").PlaySync()'

# cmd.exeの場合(&で連結)
> your_program & powershell.exe -c '(New-Object Media.SoundPlayer "C:\Windows\Media\Ring01.wav").PlaySync()'

cmd.exeの場合、別途音声再生用のプログラムを起動すれば良いのですが、powershell.exeを呼び出すのが簡単です。

概ねこれで問題はありませんが、席を外していると音を聞き逃す可能性があります🤔

🐧🪟方法3: トースト通知を使う(個人的おすすめ)

Windowsのトースト通知を使用すれば、音を聞き逃しても、アクションセンターに履歴が残るため、席を外していても後から確認できます。

BurntToastモジュールのインストール

PowerShellでトースト通知を簡単に扱えるBurntToastモジュールを使います。

Windows側で管理者権限のPowerShellを開き、1回だけ実行してください

PS> Install-Module -Name BurntToast -Force

「続行するにはNuGetプロバイダーが必要です」という警告が出た場合は、Yを入力してNugetプロバイダーのインストールとともに処理を続行します。

🐧WSLから呼び出す関数を作成

~/.bashrcに以下を追加します。

# シンプルなトースト通知
toast() {
    local title="${1:-通知}"
    local message="${2:-処理が完了しました}"
    local sound="${3:-Default}"
    powershell.exe -Command "New-BurntToastNotification -Text '$title', '$message' -Sound '$sound'"
}

# プログラム終了時にトースト通知(成功/失敗で通知を変える)
notify_on_done() {
    "$@"
    local exit_code=$?
    if [ $exit_code -eq 0 ]; then
        toast "完了" "コマンドが正常に終了しました"
    else
        toast "エラー" "異常終了 (code: $exit_code)" "Alarm"
    fi
    return $exit_code
}

# アラーム音付きで通知(目立たせたい時用)
toast_alarm() {
    local title="${1:-アラーム}"
    local message="${2:-処理が完了しました}"
    powershell.exe -Command "New-BurntToastNotification -Text '$title', '$message' -Sound 'Alarm'"
}

追加したら、設定を反映させます。

$ source ~/.bashrc

🐧使い方

基本的な通知

# タイトルとメッセージを指定
$ toast "ビルド完了" "makeが終了しました"

アラーム音付き通知

$ toast_alarm "緊急" "ディスク容量不足"

サウンドを指定

# 第3引数でサウンドを指定
$ toast "重要" "バックアップ完了" "Alarm2"

指定可能なサウンド一覧

サウンド 説明
Default 標準の通知音
Alarm, Alarm2Alarm10 目覚まし時計のような音
Call, Call2Call10 着信音
SMS SMS受信音
Mail メール受信音
Reminder リマインダー音

長時間プログラムの終了を通知

notify_on_done関数を使うと、コマンドの終了コードに応じて通知内容が変わります:

# 正常終了なら完了の、異常終了ならエラーのアラーム音
$ notify_on_done make -j8
$ notify_on_done python train.py
$ notify_on_done npm run build

シンプルにコマンド連結

直接コマンドと連結することも可能です。

$ your_program ; toast "完了" "処理が終わりました"

動作確認

以下のコマンドで動作を確認できます。

# 3秒後に通知
$ sleep 3 ; toast "テスト" "3秒経ちました"

# アラーム音テスト
$ sleep 3 ; toast_alarm "テスト" "アラーム音確認"

🪟使い方

PowerShellからも同様に使えます。

# シンプルな通知
PS> your_program ; New-BurntToastNotification -Text "処理完了", "プログラムが終了しました"

おわりに

BurntToastモジュールを使えば、WSLからでも簡単にWindowsのトースト通知を送れます。長時間処理を実行する際は、ぜひ活用してみてください🤩私はWindowsの通知機能は通常はOFFにしているのですが、この機能を知ってからは長時間作業のときにはONにしています。

参考