電源ボタンを(きれいに)無効にする方法は?

電源ボタンを(きれいに)無効にする方法は?

デフォルトでは、Systemdは電源ボタンを押すとコンピュータをシャットダウンするように設定されています。私のユーザーがログインしていない限り、この動作を維持したいと思います。ログインしたらすぐに閉じるのではなく、閉じるダイアログボックスを開きたいです。

ログイン時に起動し、ログアウト時に停止するユーザーサービス無効化systemd処理を実装しました。この方法は、呼び出しのために常に開いているアイドルsystemd-inhibitスレッドがあることを除いて、うまく機能します。sleep 1000d

htopクリーンアップするには、スレッドを眠らせずにこれを行う方法を探しています。

これは私のユーザーサービスです。

[Unit]
Description=User daemon to disable systemd's handling of the power button

[Service]
ExecStart=nohup systemd-inhibit \
                --what="handle-power-key" \
                --who="disable-shutdown-button script" \
                --why="allows i3 to open shutdown-dialog instead" \
                sleep 1000d

[Install]
WantedBy=default.target

編集する:ログインはlightdmディスプレイマネージャを介して行われます。

答え1

systemd-inhibit別のユーザーサービスとして設定する代わりに、起動コマンドまたはGUIログインセッションに重要なコマンドの前に追加できます。i3

systemd-inhibit重要なシステム更新タスクを実行するパッケージマネージャ、またはそのようなディスク書き込みなどの特定のタスク中に一時停止/休止状態/終了などのタスクを抑制する方法を提供することが目的であるため、実行するにはコマンドが必要になるように設計されています。抑制が必要なジョブが終了したり、何らかの理由で中断されたりすると、抑制が自動的に終了する可能性があります。

systemd-inhibitこの方法でセッションの開始に追加することは、systemd/がlogind制御グループを介してセッションに属するプロセスを追跡するために重複しているように見えるかもしれませんが、これはsleepダミーコマンドや同様のコマンドなしで使用パターンを適切にする唯一の方法です。


言及されたコメントは通常スクリプトとして実行されlightdmます。このスクリプトを変更するか、次のオーバーレイファイルをに配置できます。名前は直接選択できますが、名前にはサフィックスが必要です。lightdm-sessionsession-wrapper/etc/lightdm/lightdm.conf.d/.conf

[Seat:*]
session-wrapper=/usr/local/bin/shutdown-button-inhibit

スクリプトは/usr/local/bin/shutdown-button-inhibit次のとおりです。

#!/bin/sh
if [ $(whoami) = "Julien" ]  # edit this to match your username
then
    exec systemd-inhibit \
        --what="handle-power-key" \
        --who="shutdown-button-inhibit script" \
        --why="allows i3 to open shutdown-dialog instead" \
        lightdm-session "$@"
else
    exec lightdm-session "$@"
fi

このスクリプトを拡張子chmod 755 /usr/local/bin/shutdown-button-inhibit

使用すると、execスクリプトソルバーがlightdm-session別のプロセスで待機するのではなく、独自に置き換えられます。

lightdm設定が呼び出し以外のものとしてカスタマイズされている場合は、一致するようにlightdm-sessionこのスクリプトを編集する必要があります。

関連情報