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

관련 정보