Sigwire:Linux マシンの全ての信号に対するライブ TUI スイッチボードに関する投稿です

2026/07/14 5:07

Sigwire:Linux マシンの全ての信号に対するライブ TUI スイッチボードに関する投稿です

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

Sigwire は、侵入的なツール(

strace
または
ptrace
など)を使わずに、カーネルレベルの信号 tracepoint をデコードして送信元、ターゲット、信号タイプ、原因、および disposition というリアルタイムの詳細情報をターミナルにストリーミングすることで、信号デバッグを革新します。 bounded ring buffer を使用したパッシブな tracepoint 書き込みを利用し、高パフォーマンスを実現しており、
rt_sigreturn
と syscall-extracepoints にフックしてハンドラーの継続時間を測定し、
EINTR
中断を検出しながらも negligible なスロウドラウンを確保します。本ツールは Linux カーネルの BTF サポート(CONFIG_DEBUG_INFO_BTF)と
yeet
デーモンに依存し、効率的なprivileged component のロードを実現しています。インターフェースはインタラクティブな制御を提供しており、ユーザーは一時停止/再開 (
p · Space
)、行移動 (
↑/↓
,
k/j
)、ファジーフィルター (
/
)、
EINTR
だけの表示 (
e
)、シグナルのミュート(トグル、グローバルビット操作、例:デフォルトでは
SIGCHLD
SIGURG
SIGWINCH
をミュート)、終了 (
q
) を実行できます。各行にはタイミング、送信元、重大度コード付きの信号タイプ(色は致命傷またはキル可能な信号に対してホットレッドから他に対してバイオレット/グレーまで範囲)、ターゲット、およびソース/EINTR 状態に関する注釈が表示されます。厳格な fatal カウンター(
)は、
SIGKILL
やカーネルによるコアダンプイベントなどのつかえないシグナルだけを追跡します。裏側では、BPF プログラム(
sigwire.bpf.c
deliver.bpf.c
)が
(target tid, signal)
マップを介して相関するプローブにリンクし、JS プローブがこのマップをバインドしています。インストールは簡単な curl コマンドによる
yeet
デーモンのインストールで行うのが簡単ですが、開発者は Sigwire が可観測性のみを提供し、シグナルのブロックや遅延を行うことができず、タイミングはカーネルフレームの継続時間のみを反映する点に注意する必要があります。品質保証には verifier 互換性チェック(
make veristat
)および LVH/QEMU VM で Cilium イメージを使用して行うマテックステストが含まれます。

本文

sigwire: カーネル信号処理の可視化ライブパッチボード

概要

sigwire
は、ホスト上のあらゆるプロセスから放出されるすべての信号をリアルタイムでキャプチャし、ターミナルにストリーミング表示するツールです。

  • 対象範囲: ホスト上の全プロセス(特定の PID 限定ではありません)。
  • 追跡方法:
    strace -f
    のようにターゲットの協力が不要であり、
    ptrace
    を使用しません。
  • 可視化方式: カーネルの信号処理を**「ライブパッチボード」**として可視化します。

表示の特徴

各情報は以下の要素で構成され、Severity(優先度)に応じた色付けが施されます。

  • 発生方法のタグ: システムコール名などの情報源を示します。
  • 処理結果: ターゲットがハンドラを呼び出したか(実行時間を含む)、デフォルト動作に陥ったか、無視したかを判定します。
  • システムコール中断 (
    EINTR
    )
    : 待機中のシステムコールが信号で切断されたことを示します(例:
    ↯ EINTR read
    )。
  • スパム統合: 連続した同一信号は
    ×N
    として表示し、画面を汚しません。
  • 致命傷識別: 本物の致命的な攻撃には☠記号が表示されます。

**サイドレール(右パネル)**では、「ワイヤー(信号の流れ)」を横断する集計情報が確認できます。行を選択または一時停止すると、その瞬間の詳細情報(ディスポジション、ハンドラアドレス、

sigaction
フラグ、ブロックされていた信号など)を表示可能です。


動作原理:2 つの視点

sigwire
は以下の 2 つの観点からの情報を統合して表示します。

  1. 生成側 (
    signal:signal_generate
    )
    • 誰が何を発射したか(送信者の視点)。
    • カーネルやアプリによるシグナル発生源を追跡します。
  2. 受領側 (
    signal:signal_deliver
    )
    • ターゲットがどう反応したか(ハンドラの実行、ブロック状況、システムコールの中断)。

これに加え、以下のフックを使用して精度を向上させています:

  • rt_sigreturn(2)
    syscall-exit
    トレースポイントを用いてハンドラの走行時間を計測。
  • EINTR
    の発生を検出。

これらはすべて 1 つの行に相関付けられており、表示されています。☠「致命的なカウント」は保守的に設定されており、意図的に慎重に判定します。


クイックスタート (Linux)

インストール

特別な設定は不要です。信号は常に背景トラフィックとして存在するため、即座に表示が始まります。

curl -fsSL https://yeet.cx | sh              # yeet デモンをインストール(初回のみ)
yeet run github:yeet-src/sigwire             # ダッシュボードを実行

サンプル出力(生成された信号の例)

画面の上部に新しいデータが表示されます。

WHENSENDER (送信者)SIGNALTARGET (ターゲット)NOTE (注釈)
now
bash·4402──SIGINT───▶
node·8813
kill(2)  ↯ EINTR read  caught 41µs
1.2s
systemd·1──────SIGTERM──▶
nginx·1291
kill(2)  caught 1.2ms
3.4s
kernel·8813──SIGSEGV──▶
chrome·8813
fault    default  ☠
4.1s
postgres·507──SIGUSR1───▶
postgres·509 ×6
kill(2)  caught 9µs

コントロールキーボード操作

フィードはデフォルトで最新情報のみを表示しますが、一時停止して詳細を確認できます。

キー操作内容
p
/
Space
フィードの一時停止 / 再開(読み取り用に凍結)
/
,
k
/
j
行を一時停止して詳細パネルを開く
/
フォジィフィルター: プロセス名、PID、信号、ソース、処理結果への文字検索(一致部分はハイライト)
e
フィルターを「中断されたシステムコール」に制限 (
↯ EINTR
/
↺ 再起動済み
)
s
シグナル選択画面: 全信号のオン/オフ切り替え(リアルタイム更新)
Esc
1 レベル戻る(フィルタークリア、選択解除など)
q
終了

表示内容の詳細解説

各行は独立したブロックです。送信者からターゲットへ、色分けされた「ワイヤー(信号名)」が流れます。

色の種類 (Severity)

カテゴリ (Priority)信号一覧 (Examples)色 (Colour)
kill
SIGKILL
hot red (鮮やかな赤)
fatal (core-dumping)
SEGV
,
BUS
,
ABRT
,
ILL
,
FPE
,
TRAP
,
SYS
,
QUIT
red
terminating
TERM
,
INT
,
HUP
,
PIPE
,
ALRM
...
amber (オレンジ)
job control
STOP
,
TSTP
,
TTIN
,
TTOU
yellow
continue
CONT
green
user
USR1
,
USR2
cyan
real-time
SIGRTMIN+n
violet (紫)
housekeeping
CHLD
,
URG
,
WINCH
...
grey

注釈欄の構成要素

  1. ソース:
    kill(2)
    ,
    tgkill
    ,
    sigqueue
    , タイマー, カーネル, 故障など。
  2. 中断状態: 待機中のシステムコールが切断された場合、
    ↯ EINTR read
    (または SA_RESTART による自動再起動
    ↺ restarted read
    ) が記録されます。
  3. 処理結果:
    • caught <時間>
      : ハンドラ実行(例:
      41µs
    • default
      : デフォルト動作適用(終了など)
    • ⊘ ignored
      : 無視
    • : 致命的な状態

シグナルの詳細確認

フィードを一時停止し、

↑/↓
または
p
で詳細パネルを開くと、配送側の情報全体が表示されます。

キー値の例意味
SIGNAL
SIGUSR1 (10) user
信号名・番号・カテゴリ
from
/
to
ctarget·3980913
送信元/宛先(tid)
RAISED
via tgkill
,
code SI_TKILL
,
scope thread
発射メソッド・詳細コード・スコープ
result
delivered
状態:配信済
DELIVERY
handled caught
処理結果: ハンドラ呼び出し、デフォルト動作、無視のいずれか
syscall EINTR ← read
中断検出: 待機中のシステムコールが切断されたか (
SA_RESTART
で再開されたか)
handler 0x55f0a1c3
ハンドラアドレス
ran 3.0ms
実行時間:
rt_sigreturn(2)
までの経過時間
flags SA_SIGINFO
sigaction
フラグ一覧 (
SA_RESTART
など)
TARGET BLOCKS
SIGINT SIGQUIT SIGTERM
デリヴァリー時のブロックマスク (
sigprocmask
)
  • handled: ハンドラが実行された場合 (
    caught
    )、デフォルト動作 (
    default
    )、無視 (
    ignored
    )。
  • syscall EINTR: 処理結果にはありません。中断を検知するためのみ表示されます(例:
    EINTR ← read
    )。
  • TARGET BLOCKS: カーネルの
    task_struct
    から直接取得された情報です。

「何が致命的とみなされるか」 (What counts as fatal)

☠「致命傷カウンター」と☠「行バッジ」は、**意図的に厳格(保守的)**に設定されています。なぜなら、生成時点ではターゲットがハンドラを持っているかが分からないためです(例:

SIGTERM
はクリーンシャットダウンや無視の可能性もあります)。

☠ を付与するのは明白なケースのみです:

  1. SIGKILL
    の配信
    —— キャッチも無視も不可能。常に致命傷。
  2. カーネル由来のコアダンプ誘発信号 (
    SEGV
    ,
    BUS
    ,
    ABRT
    ,
    ILL
    ,
    FPE
    ,
    TRAP
    ,
    SYS
    ,
    QUIT
    ) —— シンクロな故障またはキル。

それ以外のすべて(

systemd
からの
SIGTERM
, キーボードの
Ctrl-C
SIGINT
, ランタイムからの自己管理信号など)は表示・色付けされますが、致命傷とはカウントされません。


シグナル選択器 (ライブカーネルノブ)

以下の 3 つの信号はホスト上で頻繁に発生する「雑音」となります:

  • SIGCHLD
    (子プロセスのリピーク)
  • SIGURG
    (Go のハートビート)
  • SIGWINCH
    (ターミナルリサイズ)

デフォルト設定: これら 3 つはカーネルレベルでミュートされており、フィードは重要度のあるトラフィックのみを表示します。

ミュートの切り替え

s
キーを押し、シグナル選択器を開くと以下の操作が可能です:

  • モーダルリストで全信号のオン/オフ切り替え。
  • 矢印キーまたは数字入力で移動し、Space で瞬時のトグル。
  • a
    キー: すべてを反転(ミュート解除 / ミュート)。

仕組み:

  • ミュートマスクは BPF プログラム内のグローバル変数に格納されており、行のトグル操作によって即時反映されます(再コンパイル不要)。
  • カーネルはミュートされた信号をリングバッファに入れる前にドロップするため、オーバーヘッドはありません。

仕組み (How it works)

アーキテクチャ

コアは以下のコンポーネントで構成されています:

  • BPF 側:
    src/bpf/sigwire.bpf.c
    +
    src/bpf/deliver.bpf.c
    (カーネル空間)
  • ユーザースペース:
    src/probes/sigwire.js

すべてのイベントは

(target tid, signal)
で相関付けられています。

BPF のトレースポイント

プログラム付着先 (Probe)捕捉内容
on_signal_generate
signal:signal_generate
送信情報: 発射元、ターゲット、信号種別、グループフラグ。
※ミュート設定があればここでドロップされる
on_signal_deliver
signal:signal_deliver
配送情報: ディスポジション (
sa_handler
)、フラグ、ブロック済み sigset。
※ハンドラ実行用のスタンプ記録
(rt_sigreturn)
syscalls:sys_enter_rt_sigreturn
完了検出: 配信と戻り処理の差分からハンドラ走行時間を取得
(sys_exit)
raw_syscalls:sys_exit
中断検出:
-ERESTART*
の復帰を記録し、次回の配送と相関させて EINTR/再起動を判定

メモリマップ(共有領域)

  • events: RINGBUF。生成イベント格納用。
  • dispatch: RINGBUF。配送完了イベント格納用。
  • mute_mask:
    .data
    セクションのグローバル変数 (
    __u64
    )。ミュートビットマスク。
  • handler_start / restart_pending: 各スレッド (tid) 用の HASH マップ。時間窓内でイベントを相関付けるために使用。

JS のコンポーネント

ファイル役割
src/probes/probe.js
BPF オブジェクトのロード、マップバインド、自動付着
src/probes/sigwire.js
中核モジュール: 2 つのリングバッファ統合、相関ロジック、ミュート制御
src/main.jsx
アプリのルート(入力、レイアウト、マウント)
src/components/feed.jsx
メインボード: 「送信──SIG──▶ターゲット」フロー、結果表示、バッジ付け、色付け
src/components/tally.jsx
サイドレール:トップ信号、ソース内訳、配送合計
src/components/detail.jsx
インスペクター:詳細情報の表示・操作
src/components/picker.jsx
シグナル選択モーダル
src/components/titlebar.jsx
ヘッダー:ブランド、レート、合計、致命傷カウンター、ミュート数、停止状態
src/components/footer.jsx
フッター:キーヒントとフィルター案内
src/lib/signals.js
データ定義: 名前、優先度、色、コードからメタデータをマッピング
src/lib/format.js
フォーマッタ:パディング、トリミング、相対時刻計算、カウント統合
src/lib/fuzzy.js
検索エンジン: 名/PID/信号/ソースへの部分文字列マッチ

なぜ
strace
ptrace
の代わりにトレースポイントなのか?

  • strace -f
    : プロセスツリー単位で追跡するため、設定が複雑。イベント発生時停止が必要。
  • ptrace
    : 侵襲的であり、ターゲットごとに手動でのセットアップが必要。
  • sigwire
    (トレースポイント)
    :
    • カーネルの「縫い目」を監視するだけであり、アプリ側の設定やプロセス停止は不要。
    • 生成 ↔ 配送 ↔ 完了
      という全ライフサイクルを一度に捉え、送信者・ターゲットペア、処理結果、ハンドラ遅延、EINTR を包括的に可視化できる。

コミュニティからの疑問への回答

Q: 追跡されたプロセスへのオーバーヘッドはあるか? A: **ありません。**トレースポイントは受動的です。コストは各信号あたりのリングバッファ書き込みと EINTR 検出時の数命令のみです。ユーザースペースが処理しきれない場合、リングバッファーはドロップするだけでブロッキングしません。

Q: 既に動作中のプロセスの信号も表示されますか? A: はい。

sigwire
がロードされた時点以降に発生するすべての信号をキャプチャします。過去のイベントは映らない特異性はありません。

Q: 特定の PID のみ追跡できますか? A: ホスト上の全プロセスを同時に監視・区分けしています。これはマシンの全体信号トラフィックです(単一 PID 限定ではありません)。

Q: データのエクスポートは可能ですか? A: 標準機能としてはいませんが、

src/probes/sigwire.js
RingBuf.subscribe
を利用して、JSON/HTTP/Kafka へのストリーム出力をカスタマイズすることは可能です。


ソースからのビルド

以下のコマンドでローカル開発環境を構築します。システム側の C/BPF ツールチェーンや Node.js は不要です(依存はすべて vendored)。

make          # 全ビルド (BPF + JS)
make bpf      # BPF オブジェクトのみ (`bin/probe.bpf.o`)
make bundle   # JS バンドルのみ (`src/index.jsx`)
make clean    # アーティファクト削除

ビルド後、以下のコマンドで実行します:

yeet run .    # ローカルビルドの実行

ライセンス: Dual BSD/GPL。

同じ日のほかのニュース

一覧に戻る →

2026/07/14 7:19

『アジア最浄の村』が日曜日観光客禁止に

## Japanese 翻訳: 2026 年 1 月以来、インディアのメガラヤ州にある約 600 人の居住者がいるモーリャン・オン(Mawlynnong)村では、「真の村の生活」を再建する目的として、日曜日の昼間の観光客に対する厳格な禁止措置を導入しています。1902 年に設立された教会が存在し、人口の推定 100% がクリスチャンであるこのコミュニティは、日曜日には単一の道路への入口を黒い金属製のゲートで閉鎖して、 uninterrupted な礼拝を保証しています。以前からほとんどの観光関連事業所が日曜日の営業停止を選択していました(レストランは 2 カ所のみ営業)ましたが、公式な禁止措置により、今では店舗や一日利用施設が完全に閉鎖されるようになっています。一泊予約を持つゲストはこの昼間の旅行禁止からの例外扱いで、ゲストハウスに滞在することができ、一方で地元のレストランや記念品販売店は引き続き閉鎖されています。住民は、村評議会の委員でもあるプリシウス・コングドプ(Precious Khongdup)を含むコミュニティの一致した支持を受けながら、この取り組みを文化のアイデンティティ、精神的なリズム、および 2003 年に「アジアで最も清潔な村」と命名されたり、2014 年にナレンドラ・モディ首相のクリーン・インディア・ミッションキャンペーンの際に全国的な注目を得たりした功績をもたらした規律を保持するために不可欠だと考えています。この決定は、観光客による妨害に対する具体的な懸念に対応しており、観光客が地面にプラスチック製の水ボトルを置き去りにするというバイラル化した事象などが挙げられ、これにより地元からは強い反発が生じていました。言語学の教授ヴィジャヤ・デブナス(Vijaya Debnath)を含む専門家は、このイニシアチブを称賛しており、清潔さを維持しつつ、村民の静かな一日の休息と祈りの必要性にも敬意を表していると評価しています。

2026/07/14 3:22

Xcode を起動することなく Mac および iOS アプリを開発して配送する方法

## Japanese Translation: 本テキストでは、Xcode を一度設定した後の開封を不要とする堅牢で完全にヘッドレスの iOS アプリケーションの作成・デプロイワークフローが概説されています。シェルスクリプトによるライフサイクル全体のアオマティゼーションを通じて、開発者は `xcodebuild` コマンドラインツールを用いてコードをコンパイルし、`notarytool` によってビルドを保護し、`devicectl` を用いて物理デバイスにアプリを直接インストールします。セキュリティは、証明書ベースのキーチェーンおよび外部パスワードマネージャーの活用により維持され、プライベートキーなどの機密情報はバージョン管理システムへの投入を完全に防ぎます。本システムは XcodeGen を用いてプロジェクトを管理し、煩雑なローカルフォルダではなくクリーンな YAML 設定ファイル(`.yml` ファイル)によってプロジェクトを制御し、アドホックテスト版と公式開発者 ID リリースを自動的に区別します。一度設定されたリリーススクリプトは、アーカイブ、署名、認証化、スタプリング、インストールを含む厳格なパイプラインを実行し、沈黙する失敗を防ぐために堅牢なエラー処理(`set -euo pipefail`)を採用します。このアプローチは、チームが手動のマウス操作または GUI ウィンドウなしに、実際に動作するソフトウェアを効率的にデプロイするために安全で再現可能な CI パイプラインを構築することを可能にします。 ## Text to translate: The text outlines a robust, fully headless workflow for creating and deploying iOS applications that eliminates the need to open Xcode after an initial setup. By automating the entire lifecycle through shell scripts, developers utilize command-line tools such as `xcodebuild` to compile code, `notarytool` to secure builds, and `devicectl` to install apps directly onto physical devices. Security is maintained by leveraging certificate-based keychains and external password managers, ensuring sensitive secrets like private keys never enter version control. The system employs XcodeGen to manage projects via clean YAML configurations (`.yml` files) rather than cluttered local folders, automatically distinguishing between ad-hoc testing versions and official Developer ID releases. Once configured, a release script executes a rigorous pipeline involving archiving, signing, notarizing, stapling, and installation, while using strict error handling (`set -euo pipefail`) to prevent silent failures. This approach empowers teams to establish secure, repeatable CI pipelines that deploy real software efficiently without any manual mouse interactions or GUI windows.

2026/07/14 1:06

Apple が発表した新たな音声分析 API「SpeechAnalyzer」のベンチマークテストで、Whisper とその前代モデルと比較

## Japanese Translation: Apple の新しい SpeechAnalyzer API は、次期 OS 26 の一部として提供されるもので、英語の読み上げ音声に対する優れたオンデバイス音声認識を実現しており、特定ベンチマークコンテキスト内では従来のツールや人気が高い Whisper モデル(Tiny, Base, Small)を大幅に上回っています。この優位性は、M2 Pro チップなどの Apple ハードウェアで行われた厳密なローカルベンチマークを通じて証明され、オーディオを外部サーバーにアップロードすることなく、高速な処理速度——Whisper Small の計算時間の約 1/3——を実現することが示されました。清潔な LibriSpeech テストデータに対しては、従来の SFSpeechRecognizer API に比べて単語誤りを約 4 倍削減し(2.12% WER から 9.02%)、ノイズのあるデータに対しても同様の劇的な改善が見られました。この研究では、Inscribe のプロダクションコードパスと同一のテストハルネスを用い、Whisper の測定値は OpenAI が公開した値と比較しましたが、Whisper の相対的な不正確さは、これらのベンチマーク(アクセントのある音声、遠距離音声、または複数話者シナリオを含まない)に限定されたもの임을 指摘しました。重要なのは、すべてのテストが完全にオンデバイスで行われたことであり、従来の SFSpeechRecognizer もローカルで使用される場合でもクラウド処理にデフォルトで切り替わるという点です。これらの結果に基づき、Inscribe は製品ロジックを更新し、対応言語(現在約 30 のロケール)では SpeechAnalyzer を優先し、未対応の言語のみを Whisper に切り替えました。さらに、研究チームは Inscribe が SpeechAnalyzer でオーディオファイルを取り扱う際に重大なバグを見出し、生テキストデータを検証のために公開ダウンロード可能とする措置を講じました。これは、Apple エコシステム内のプライバシー重視かつ高パフォーマンスなオンデバイス AI 機能において大きな飛躍を意味します。