พื้นหลังไม่เปลี่ยนแปลงโดยใช้ gsettings จาก cron


11

ฉันกำลังพยายามเปลี่ยนรูปพื้นหลังเป็นภาพสุ่มโดยใช้สคริปต์ที่แนะนำของ Indrajith Indraprastham ที่นี่: จะเปลี่ยนพื้นหลังเดสก์ท็อปจากบรรทัดคำสั่งใน Unity ได้อย่างไร

เมื่อฉันเรียกใช้สคริปต์จากหน้าต่างเทอร์มินัลการเปลี่ยนแปลง bg ใช้ได้ แต่เมื่อมันทำงานจาก cron ฉันส่งข้อผิดพลาดนี้ทางไปรษณีย์:

(กระบวนการ: 21901): dconf-WARNING **: ล้มเหลวในการส่งการเปลี่ยนแปลงไปยัง dconf: เกิดข้อผิดพลาดในบรรทัดคำสั่งที่วางไข่ 'dbus-launch --autolaunch = 00216c114dcf433c9bb9009985d607d6 --binary-syntax --close-stderr': กระบวนการเด็กออกจากรหัส 1

ฉันขอขอบคุณข้อเสนอแนะใด ๆ


1
@ Merri นอกเหนือจากข้อเท็จจริงที่ว่าคำตอบที่นั่นไม่ได้แก้ปัญหาของ OP (ซึ่งจะไม่ทำให้มันเป็นดักโดยวิธี), วิธีนี้จะเป็น dupe ???? ข้อผิดพลาดเดียวกันไม่ได้หมายความว่ามันเป็นคำถามเดียวกัน
Jacob Vlijm

คำตอบ:


16

การแก้ไข gsettings จาก cron ตัวแปรสภาพแวดล้อมที่ขาดหายไป

หากคุณเรียกใช้สคริปต์จากสภาพแวดล้อมของคุณเอง (เช่นจากหน้าต่างเทอร์มินัลหรือจากแอปพลิเคชันเริ่มต้น) ตัวแปรสภาพแวดล้อมจำนวนหนึ่งจะถูกตั้งค่า cronอย่างไรก็ตามเรียกใช้สคริปต์ของคุณด้วยชุดตัวแปรสภาพแวดล้อมที่ จำกัด

หากต้องการแก้ไขได้gsettingsสำเร็จcronคุณต้องตั้งค่าDBUS_SESSION_BUS_ADDRESSตัวแปรสภาพแวดล้อม คุณสามารถทำได้โดยเพิ่มสองบรรทัดลงในสคริปต์ของคุณดังที่อธิบายไว้ที่นี่ (และด้านล่าง)

สคริปต์ของคุณรวมถึงการตั้งค่าตัวแปรที่จำเป็น

สคริปต์จากที่นี่แก้ไขเพื่อรวมDBUS_SESSION_BUS_ADDRESSตัวแปรสภาพแวดล้อมจากนั้นกลายเป็น:

#!/bin/bash

PID=$(pgrep gnome-session)
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-)

DIR="/home/indra/Pictures/wallpapers"
PIC=$(ls $DIR/* | shuf -n1)
gsettings set org.gnome.desktop.background picture-uri "file://$PIC"

ที่เกี่ยวข้อง: ใช้. sh ทุก ๆ 5 นาที


@Shaun คุณยินดีต้อนรับ! ดีใจที่มันได้ผล :)
Jacob Vlijm

1
ฉันกำลังลองสิ่งนี้กับ Cinnamon ใน Mint เมื่อฉันเรียกใช้จาก cli โดยตรงฉันได้รับ "dconf-WARNING *: ล้มเหลวในการส่งการเปลี่ยนแปลงเป็น dconf: ที่อยู่ที่ระบุว่างเปล่า" มันใช้ในการทำงานก่อน (จาก CLI) โดยไม่ต้อง PID และ DBUS_SESSION_ (แต่ไม่ใช่จาก cron)
donquixote

1
@donquixote ลองPID=$(pgrep -f 'gnome-session' | head -n1)!
Jānis Elmeris

คุณสามารถแทนที่DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-)ด้วย$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ)เนื่องจาก grep ได้รับชื่อตัวแปรด้วย แหล่งที่มา
wjandrea

1
pgrep gnome-sessionอาจส่งคืนมากกว่าหนึ่ง pid หากผู้ใช้หลายคนลงชื่อเข้าใช้ระบบ (แต่ละเซสชันที่เรียกใช้ gnome-session) บางทีEUID=$(id --real --user)และPID=$(pgrep --euid $EUID gnome-session)อาจเป็นวิธีการรับเฉพาะ PID ที่เกี่ยวข้องกับเซสชัน gnome ของผู้ใช้ปัจจุบัน
unutbu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.