はじめに
PCを使っていると、どのウィンドウをいつ開き、いつ閉じたのかという情報を取得したくなることがあります。例えば、特定のアプリを起動していた時間を後から集計して「今日は何時間使ったか」を確認したいといった用途が考えられます。今回はLinuxのタイル型ウィンドウマネージャである「Hyprland」でのやり方を紹介します。Hyprlandのイベントソケットを監視して、ウィンドウの開閉イベントをログとして出力するシェルスクリプトを作成します。
仕組み
Hyprlandは、外部プログラムがイベントを購読できるようにUNIXドメインソケットを提供しています。デフォルトでは $XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock に存在します。これを socat コマンドなどを使って読み取ることで、リアルタイムにイベントを取得できます。
実装
ロギングスクリプト
socat でソケットに接続し、流れてくるイベントを1行ずつ読み取ります。openwindow(ウィンドウが開いた)や closewindow(ウィンドウが閉じた)などのキーワードをキャッチして、標準出力に整形して書き出します。
#!/bin/bash
#
# Hyprlandのウィンドウイベントを監視し、ログを出力するスクリプト
#
set -u
set -e
# Hyprlandのソケットパスを設定
HYPR_SOCKET=$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock
if [ -z "$HYPR_SOCKET" ]; then
echo "Error: Hyprland socket2.sock not found."
exit 1
fi
# ログの開始を記録 (<7>はsyslogのDebugレベル)
printf "<7>logging_start\t%s\n" "$HYPR_SOCKET"
# socatでソケットを監視し、1行ずつ処理
socat -U - "UNIX-CONNECT:$HYPR_SOCKET" | while read -r line; do
case "$line" in
openwindow*)
# 形式: openwindow>>[address],[workspace],[class],[title]
printf "<6>openwindow\t%s\n" "${line#*>>}"
;;
closewindow*)
# 形式: closewindow>>[address]
printf "<6>closewindow\t%s\n" "${line#*>>}"
;;
movewindow*)
# ワークスペース移動なども追いたい場合はここに追加
printf "<6>movewindow\t%s\n" "${line#*>>}"
;;
esac
done
printf "<6>..." のように記述しているのは、systemdのジャーナルでログレベル(6: Info, 7: Debug)として認識させるためです。数値の詳細は systemd/Journal - ArchWiki で確認できます。
セットアップ
スクリプトの起動はHyprlandの設定ファイルで行います。肝心のソケットファイルはHyprlandが起動してから生成されます。そのため、~/.config/hypr/hyprland.conf に以下のように記述します。
exec-once = $HOME/hypr_window_logger.sh 2>&1 | logger --prio-prefix -t hypr_window_logger.sh
今回、ログ管理には logger コマンドを活用しました。標準出力の内容をシステムログ(Journald)に直接流し込めるため、ログローテーションやファイル書き出しの制御を自前で実装する必要がなくなります。
使い方
Hyprlandにログインすると、バックグラウンドでロギングが開始されます。ログを確認するには journalctl を使用します。
journalctl --output=short-iso -t hypr_window_logger.sh -f
適当なアプリを起動・終了して、ウィンドウの開閉イベントを発生させると、以下のようなログが出力されるはずです。
2026-04-30T10:00:00+09:00 arch hypr_window_logger.sh[1234]: <6>openwindow 55f1234567,1,Alacritty,terminal
2026-04-30T10:05:00+09:00 arch hypr_window_logger.sh[1234]: <6>closewindow 55f1234567
後で分析するため、以下のようにJSON形式で出力しておくとよいでしょう。
journalctl --output json -t hypr_window_logger.sh --since "24 hour ago" >today.json
今後の展望
今回は「ログを取る」ところまでを実装しました。今後は溜まったログを解析して、以下のような処理を行いたいと考えています。
-
openwindowからclosewindowまでの時間をウィンドウクラスごとに計算。 -
class名(例:steam_app_12345)をもとに、特定のアプリの起動時間を集計。 - 月ごとや日ごとのレポートを出力。
自動で「いつ何をしていたか」が記録されるのは、PC環境の改善や習慣の振り返りに役立ちそうです。