Score:2

เกิดข้อผิดพลาดในการเรียกใช้ systemd ในฐานะผู้ใช้ - ไม่สามารถเชื่อมต่อกับบัส: ไม่ได้กำหนด $DBUS_SESSION_BUS_ADDRESS และ $XDG_RUNTIME_DIR

ธง sr

ฉันมีสคริปต์ที่ทำงานในฐานะรูทและกำลังพยายามตั้งค่าบริการผู้ใช้เพื่อเรียกใช้ IPFS daemon ปัญหาคือฉันต้องเปิดใช้งานบริการในฐานะผู้ใช้แทนที่จะเป็นรูท โดยปกติแล้วจะใช้งานได้หลังจากรีสตาร์ท แต่ฉันต้องการหลีกเลี่ยงหากทำได้

สคริปต์บริการอยู่ที่ ~/.config/systemd/user/ipfs.service

ประกอบด้วย:

[หน่วย]
คำอธิบาย=IPFS daemon

[บริการ]
# Environment="IPFS_PATH=/data/ipfs" # เส้นทางทางเลือกไปยังไดเรกทอรีเริ่มต้นของ ipfs หากไม่ใช่ค่าเริ่มต้น (\$HOME/.ipfs)
ExecStart=/usr/local/bin/ipfs daemon
รีสตาร์ท = เมื่อล้มเหลว

[ติดตั้ง]
ต้องการโดย=default.target

(ฉันเอารหัสนี้มาจากที่นี่: https://github.com/ipfs/go-ipfs/tree/master/misc )

หากฉันเรียกใช้คำสั่งเหล่านี้ในฐานะผู้ใช้ คำสั่งจะทำงานได้อย่างถูกต้อง:

systemctl --user เปิดใช้งาน ipfs
systemctl - ผู้ใช้เริ่มต้น ipfs

ปัญหาคือสคริปต์ของฉันทำงานในฐานะรูท และฉันไม่สามารถหาวิธีทำให้สคริปต์นี้ทำงานในฐานะผู้ใช้ได้ ฉันได้ลองแล้ว:

    # เปิดใช้งาน linger เพื่อให้ IPFS สามารถทำงานได้เมื่อบู๊ต
    loginctl enable-linger $USER_ACCOUNT

    # เปิดใช้งานบริการเพื่อเรียกใช้เมื่อบูต
    sudo -u $USER_ACCOUNT systemctl --user enable ipfs

    #เริ่มใช้บริการได้เลย
    sudo -u $USER_ACCOUNT systemctl --user start ipfs

น่าเสียดายที่บริการนี้ไม่เริ่มทำงานและเมื่อฉันได้รับข้อความแสดงข้อผิดพลาดนี้:

ไม่สามารถเชื่อมต่อกับบัส: ไม่ได้กำหนด $DBUS_SESSION_BUS_ADDRESS และ $XDG_RUNTIME_DIR (พิจารณาใช้ [email protected] --user เพื่อเชื่อมต่อกับบัสของผู้ใช้รายอื่น)

เมื่อสคริปต์เสร็จสิ้น และฉันรีบูต บริการก็เริ่มต้นได้ดี แต่ฉันต้องการหลีกเลี่ยงไม่ให้ผู้ใช้ต้องรีบูต หากทำได้ ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม

Nate T avatar
it flag
มันสำคัญที่สคริปต์ทำงานหรือไม่? หากคำตอบคือไม่ ให้ลองเรียกใช้จาก TTY อื่น บางครั้งสิ่งนี้จะทำงานเมื่อดูเหมือนว่าไม่ควร SystemD ควรพร้อมใช้งานจากทุกที่ มันเป็นล็อกอินเชลล์ ดังนั้น env ข้อกำหนดจะแตกต่างกัน จริง ๆ แล้วฉันไม่รู้ว่ามันจะได้ผลหรือเปล่า แต่ฉันอยากรู้
cn flag
ใน https://github.com/eriksjolund/user-systemd-service-actions-workflow/blob/main/.github/workflows/demo.yml#L18 ฉันต้องเพิ่ม `sleep 1` และ ` `XDG_RUNTIME_DIR=/ รัน/ผู้ใช้/$UID` หากคุณใช้งานในฐานะรูท คุณสามารถลอง `systemd-run --quiet --machine= $USER_ACCOUNT@ --user --collect --pipe --wait systemctl --user enable ipfs`
Score:0
ธง us

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

ถ้าคุณใช้ systemctl --user --global เปิดใช้งาน จากนั้นบริการจะเปิดใช้งานสำหรับผู้ใช้ทั้งหมด

Nate T avatar
it flag
systemd ไม่ใช่แค่ไบนารีในไดเร็กทอรี bin มันเป็นระบบตัวอักษร ไม่มีอินสแตนซ์เฉพาะของผู้ใช้
us flag
มีสอง systemd กระบวนการ อันแรกรันเป็น /sbin/init และเริ่มบริการทั่วโลก อันที่สองเปิดตัวเมื่อผู้ใช้เข้าสู่ระบบและเริ่มบริการผู้ใช้ ตัวแปรสองตัวที่เป็นปัญหาที่นี่ถูกกำหนดโดยกระบวนการที่สอง

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา