ฉันจะตั้งค่าเซอร์วิส systemd เพื่อเริ่มต้นโดยผู้ใช้ที่ไม่ใช่รูทเป็น daemon ผู้ใช้ได้อย่างไร


20

ฉันเพิ่งเสร็จสิ้นกระบวนการติดตั้งและตั้งค่าของ systemd บนระบบ arch-linux ของฉัน (2012.09.07) ฉันถอนการติดตั้งinitscripts(และลบไฟล์กำหนดค่า)

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

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

ไฟล์บริการที่ฉันใช้สำหรับระบบ:

[Unit]
Description=rTorrent

[Service]
Type=forking
ExecStart=/usr/bin/screen -d -m -S rtorrent /usr/bin/rtorrent
ExecStop=/usr/bin/killall -w -s 2 /usr/bin/rtorrent

อัปเดต # 1 :

หลังจากอ่านหน้า man ที่นี่และที่นี่ฉันเข้าใจว่า systemd ทำงานได้ดีขึ้นเล็กน้อย โดยเฉพาะอย่างยิ่งการใช้User=และWorkingDirectory=ตัวเลือกอนุญาตให้เริ่มบริการในเซสชันของผู้ใช้ แต่ปัญหายังคงอยู่ที่การใช้งานของตัวเองไม่ได้start, stop, enableหรือdisableบริการ เข้าถึงถูกปฏิเสธsystemctlข้อผิดพลาดจะได้รับจาก

อัปเดต # 2 :

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

ดูเหมือนว่ามีข้อผิดพลาดใน DBus เวอร์ชันปัจจุบัน (1.6.4-1) ซึ่งไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อมDBUS_SESSION_BUS_ADDRESSหมายถึงการใช้systemctl --userข้อผิดพลาดคำสั่งด้วย:

Failed to get D-Bus connection: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11

ตัวแปรควรมีลักษณะดังนี้:

DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/USERUID/dbus/user_bus_socket"

โดยที่USERUIDต้องเป็น UID ของผู้ใช้ที่กำหนด


ฉันรู้ว่าสามารถสร้างไฟล์บริการแยกต่างหากต่อผู้ใช้และเปิดใช้งานมัน อย่างไรก็ตามฉันแค่อยากรู้ว่ามันเป็นไปได้ที่ฉันได้อธิบายไว้ข้างต้น
ฮันส์

ยุติธรรมพอฉันสามารถตั้งค่าได้ง่ายsudoสำหรับผู้ใช้และมีพวกเขาตามที่ระบุไว้ในความคิดเห็นของฉันข้างต้นควบคุมไฟล์บริการของตนเอง แต่วิธีนี้จะช่วยให้ผู้ใช้สามารถควบคุมการให้บริการอื่น ๆ มากที่สุดเช่นกัน ...
ฮันส์

ถ้าคุณอ่านsudoเอกสาร - sudoers (5)มีตัวอย่างมากมายในการ จำกัด อาร์กิวเมนต์ของคำสั่ง
grawity

คำตอบ:


19

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

เนื่องจาก rtorrent ไม่ใช่บริการระบบจริงๆและเนื่องจากคุณต้องการให้ผู้ใช้ทุกคนมีอินสแตนซ์ของตัวเองของ rtorrent ให้ทดลองใช้โหมด "ผู้ใช้" ของ systemd

เมื่อคุณเข้าสู่ระบบระบบจะเริ่มuser@<uid>.serviceหน่วยระบบสำหรับคุณซึ่งจะเปิดใช้อินสแตนซ์ "--user" แยกต่างหากของ systemd ใหม่ใช้ systemd จะอ่านไฟล์หน่วย (เริ่มต้นด้วยdefault.target) จาก~/.config/systemd/user/, และ/etc/systemd/user//usr/lib/systemd/user/


1
ขอบคุณ grawity นั่นเป็นสิ่งที่ฉันคิดถึง อย่างไรก็ตามมันกลับกลายเป็นว่าเป็นปัญหาของ DBus เช่นกัน: ดูเหมือนว่าจะมีข้อผิดพลาดใน dbuse ที่ไม่ได้ตั้งค่าตัวแปรส่วนกลางที่ถูกต้อง DBUS_SESSION_BUS_ADDRESSสำหรับผู้ใช้ที่กำหนดดังนั้น systemctl ไม่สามารถเข้าถึงเซสชันผู้ใช้ เมื่อฉันค้นพบปัญหาเล็ก ๆ นี้ทุกอย่างก็ทำงานได้อย่างสวยงาม!
ฮันส์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.