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