最近 Hyprland を触っていて、しょうもないことにハマったので共有します。
ずっと Hyprland を直接起動していた
私は Arch Linux の tty から、ずっとこんな感じで Hyprland を起動していました。
Hyprlandどこかの Wiki か記事に書いてあったのをそのまま真似した形です。
ある日「start-hyprland を使え」という警告が出始めた
あるタイミングから、Hyprland を起動するとstart-hyprland経由で起動しろという警告が出るようになりました。
調べてみると、これは 0.53 の Breaking Change でした。start-hyprland が正式な launcher になり、watchdog などの挙動がそこで管理されるようになったという変更です。
その頃、Waybar が kill されていないことに気づく
start-hyprlandが何者なのかを調べたく、Hyprlandを起動したり終了したり繰り返していたのですが、Hyprland を終了しても Waybar や fcitx5 が生きていることに気づきました。
hyprland.conf の exec-once ではこんな設定をしていました。
exec-once = waybar & hyprpaper & fcitx5 & swaync & hypridle普通に考えると、Hyprland が終了 → 子プロセスである Waybar たちも終了、となってもよさそうなのですが、なぜか Waybar は残る。
exec start-hyprland を使うと全部一緒に終了する
試しに tty でこうしました。
exec start-hyprlandすると挙動が変わります。Hyprland を終了すると tty からもログアウトされ、Waybar などもまとめて kill される。めちゃくちゃスッキリしました。
なぜ違うのか──「親が死んでも子は死なない」という Linux の仕様
ここが今回の核心です。
私は最初「親プロセスが終了したら子プロセスも自動で終了する」と思っていました。でも実際は違いました。
Linux では、親プロセスが終了しても子プロセスは自動で kill されません。 孤児(orphan)になった子プロセスは PID 1(systemd)が引き取り、そのまま動き続けます。
# 親が死ぬ前Hyprland (PID 100) └── waybar (PID 101, PPID=100)
# 親が死んだ後waybar (PID 101, PPID=1) ← systemd が引き取ったつまり Hyprland が死んでも Waybar が残るのは普通のことでした。
「親が死んだら子も死ぬ」という印象はどこから来たのか
おそらく以下の経験からそう思い込んでいました。
- ターミナルを閉じると子も死ぬ — これは親の終了ではなく、ターミナルから SIGHUP が送られるから。
- Ctrl+C で全部止まる — これはフォアグラウンドのプロセスグループに SIGINT が送られるから。
- シェルスクリプト終了で子も止まる — シェルが明示的に子を kill している場合がある。
どれも「親プロセスの終了」ではなく「シグナル」や「シェルの後処理」の話だったんですね。
exec start-hyprland だと何が起きるのか
tty にログインすると、最初に bash などのログインシェルが動きます。通常はこうです。
login → bash → Hyprlandしかし exec start-hyprland を使うと:
login → exec start-hyprland → Hyprlandexec はシェル自身を完全に別プロセスに置き換えます。つまり:
- ログインシェル = Hyprland になる
- Hyprland が「セッションの顔」になる
- Hyprland が終了するとセッション終了扱いになる
- systemd がセッション内のプロセスを全部 kill する
だから Waybar も落ちますし、tty もログアウトされます。
loginctl で見るとよく分かる
loginctl session-status を見ると、こんな感じで同じセッションに乗っています。
session-1.scope ├─ start-hyprland ├─ Hyprland ├─ waybar └─ ...セッションが閉じる = まとめて終了、ということです。
start-hyprland が推奨された理由
Hyprland 0.53 からは、watchdog FD の管理、環境変数の準備、wrapper としての役割などを launcher が担うようになりました。今後は exec start-hyprland を使うのが正式な起動方法です。
まとめ
- Hyprland を直接起動すると Waybar が生き残るのは、Linux では親プロセス終了 ≠ 子プロセス自動 kill だから
- 孤児になったプロセスは systemd (PID 1) が引き取って動き続ける
exec start-hyprlandを使うとセッションそのものが終了するので、全部まとめてきれいに落ちる- 「親が死んだら子も死ぬ」という印象は、シグナルやシェルの後処理と混同していた