X11を実行せずにGSettingsを変更するには?

X11を実行せずにGSettingsを変更するには?

gsettings set約24個のコマンドを実行してターゲットコンピュータをカスタマイズするインストールスクリプトがあります。問題は、これが正しいユーザーでコマンドを実行した場合にのみ機能することです。ルートとして実行するとまったく機能しません。

だから私は次のスクリプト関数を考案しました。

function GSET
{
    echo "gsettings set '$1' '$2' '$3'"
    sudo -u mango dbus-launch gsettings set "$1" "$2" "$3"
}

その後、スクリプトは関数を数十回呼び出します。これは機能しているように見えます(つまり、設定が実際に変更されている)、すべてが正常です。

まあ、正確ではありません。設定したいコンピュータで実行すると正常に動作するようです。chrootインストールイメージを生成するために私の環境のビルドサーバーでこれを実行しようとすると...dbus-daemonサーバーで12のプロセスが実行されています。新しくインストールを実行するたびに、ますます役に立たないプロセスが実行され、最終的にサーバーにある種のリソース(PIDなど)が不足してgsettings完全に動作が停止します。

だから私の質問は:何ですか?正しい仕事はどうですかgsettings--exit-with-sessionスイッチの追加を提案する別の答えをどこかで見ましたが、これによりコマンドが機能しなくなりました。すべての設定に対してデーモンを起動して停止する方法はありますか?

答え1

発見したように、dbus-launch新しいD-Busデーモンは実行されるたびに生成されます。dbus-launch完了したら、使用して終了できます。

# Make the function
GSET () {
    sudo -u mango DBUS_SESSION_BUS_ADDRESS="$DBUS_SESSION_BUS_ADDRESS" gsettings set "$1" "$2" "$3"
}
# Launch the daemon
. <(sudo -u mango dbus-daemon --sh-syntax)
# Run as many commands as you need
GSET x1 y1 z1
GSET x2 y2 z2
...
# Kill the daemon
sudo -u mango kill "$DBUS_SESSION_BUS_PID"

反復呼び出しを避けるために、シェルベースのトランザクション方式を使用できますsudo。それは次のとおりです。

script=$(mktemp gset-transaction.XXXXXXXXXX)
create_transaction () {
    printf '. <(dbus-launch --sh-syntax)\n' > "$script"
}
GSET () {
    printf 'gsettings set "%s" "%s" "%s"\n' "$1" "$2" "$3" >> "$script"
}
commit_transaction () {
    printf 'kill "$DBUS_SESSION_BUS_PID"\n' >> "$script"
    sudo -u mango bash -c "$script"
    # optionally:
    # rm "$script"
}

create_transaction
GSET x1 y1 z1
GSET x2 y2 z2
...
commit_transaction

関連情報