ทำไมบริการ systemd ที่เปิดใช้งานของฉันจะไม่เริ่มทำงานในการบู๊ต


20

ฉันมีไฟล์ systemd unit ต่อไปนี้ใน/etc/systemd/system/emacs.service:

[Unit]
Description=Emacs: the extensible, self-documenting text editor
Documentatin=man:emacs(1) info:Emacs


[Service]
Type=forking
ExecStart=/usr/bin/emacs --daemon
ExecStop=/usr/bin/emacsclient --eval "(progn (setq kill-emacs-hook nil) (kill-emacs))"
Restart=always
Environment=DISPLAY=:%i
TimeoutStartSec=0

[Install]
WantedBy=default.target

ฉันต้องการให้มันเริ่มตอนบูทดังนั้นฉันจึงเข้า systemctl enable emacs

อย่างไรก็ตามทุกครั้งที่บริการของฉันเริ่มใหม่systemctl status emacsแสดง:

● emacs.service - Emacs: the extensible, self-documenting text editor
   Loaded: loaded (/etc/systemd/system/emacs.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

แต่จากนั้นเข้าsystemctl start emacsและตรวจสอบสถานะกลับมา:

● emacs.service - Emacs: the extensible, self-documenting text editor
   Loaded: loaded (/etc/systemd/system/emacs.service; disabled; vendor preset: enabled)
   Active: active (running) since Fri 2016-11-11 23:03:59 UTC; 4s ago
  Process: 3151 ExecStart=/usr/bin/emacs --daemon (code=exited, status=0/SUCCESS)
 Main PID: 3154 (emacs)
    Tasks: 2
   Memory: 7.6M
      CPU: 53ms
   CGroup: /system.slice/emacs.service
           └─3154 /usr/bin/emacs --daemon

ฉันจะทำให้ขั้นตอนนี้สำเร็จในการบูตได้อย่างไร

คำตอบ:


9

ฉันไม่รู้ว่าทำไม แต่เพื่อให้ทำงานฉัน:

ที่ถูกลบ Environment=DISPLAY=:%i

เพิ่มUser=ตัวแปร

ตรวจสอบให้แน่ใจว่าไฟล์ที่ถูกต้องนั้นอยู่ใน/etc/systemd/system/emacs.service(ก่อนหน้านี้เคยเป็นฮาร์ดลิงก์)

และวิ่งอีกครั้ง systemctl enable emacs

มันทำให้มันใช้งานได้

แก้ไข ปัญหาจริงที่นี่คือฉันพิมพ์ผิดที่บรรทัด 3: Documentatin

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


สิ่งนี้ใช้กับรีบูตได้หรือไม่ ฉันเดาว่าโหมด daemon ไม่ต้องการการเชื่อมต่อ X11 หรือไม่After=...ฉันไม่จำเป็นต้องพูดถึง
Alexis Wilke

1
ใช่ใช้ได้หลังจากรีบูต นี่ไม่ใช่ Emacs แบบกราฟิกดังนั้นจึงไม่จำเป็นต้องมี X11 นั่นเป็นเพียงบรรทัดที่ฉันคัดลอกมาจากตัวอย่างและไม่สนใจ
Startec

3

โอ้นี่น่าสนใจ

default.targetเลือกหน่วยบริการสุ่มและจ้องมองไปที่มันก็ขึ้นอยู่กับเป้าหมายที่เฉพาะเจาะจงแทน หลังเป็นสัญลักษณ์ ... ลิงก์ที่กำหนดค่าไปยังเป้าหมายที่เฉพาะเจาะจงความหมายมันไม่สมเหตุสมผล (ดูsystemctl set-default)

นั่นอาจอธิบายได้ว่าทำไมบริการของคุณถึงแสดงเป็นdisabledหลังจากคุณเปิดใช้งาน ลองแทนที่default.targetในไฟล์บริการของคุณด้วยmulti-user.targetเช่น

(ไม่รายงานข้อผิดพลาดเมื่อไม่สามารถเปิดใช้งานดูเหมือนข้อบกพร่องใน systemd ฉันเกือบจะสงสัยว่าตอนนี้คุณมีไดเรกทอรี/etc/systemd/system/default.target.wantsแล้วหรือยัง


คำสั่ง journalctl แจ้งให้คุณทราบถึงสิ่งที่เสียหาย (สาเหตุที่การเปิดใช้งานล้มเหลว) ส่วนการเชื่อมโยงนั้นไม่จำเป็นถ้าคุณสร้างบริการส่วนตัวของคุณเอง มันจะสำคัญแค่ไหนถ้าคุณสร้างแพ็คเกจที่คุณต้องการให้คนอื่น ๆ ติดตั้ง / ลบ ฯลฯ
Alexis Wilke

@AlexisWilke มันจะแย่กว่านี้อีก! เหตุใดจึงต้องมีการเขียนขึ้นเพื่อรายงานข้อผิดพลาดบางประการต่อ stderr และอื่น ๆ ต่อวารสาร?
sourcejedi

มันเขียนทุกอย่างลงในสมุดบันทึก จากสิ่งที่ฉันเห็นคุณจะเห็นเฉพาะข้อผิดพลาดพื้นฐานที่เฉพาะเจาะจง systemd เฉพาะถ้ามันไม่สามารถเริ่ม daemon
Alexis Wilke

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

1
@sourcejedi ฉันไม่รู้ว่าคุณรู้เรื่องนี้อย่างไร แต่ใช่ตอนนี้ฉันมีรายชื่อที่/etc/systemd/system/default.target.wants Inside ซึ่งเป็นไฟล์บริการของฉัน และใช่ฉันไม่รู้ว่ามีข้อผิดพลาดใด ๆ
Startec

1

คุณมีตัวแปรสภาพแวดล้อม DISPLAY ซึ่งหมายความว่าคุณต้องการให้ X11 เริ่มทำงาน ดังนั้นคุณต้องมีวิธีในการบล็อกบริการของคุณจนกว่าจะถึงวันนั้น

นี้จะกระทำโดยตัวเลือกAfter=...

ผมไม่เคยทำมันเองดังนั้นฉันไม่สามารถพูดได้ว่ามันจะทำงาน graphical.targetแต่มันก็อาจเป็นสิ่งที่จะทำอย่างไรกับ

[Unit]
After=graphical.target

ความเป็นไปได้อีกประการหนึ่งหากเซิร์ฟเวอร์ X ไม่เริ่มทำงานทันที (เช่นคุณมีหน้าจอเข้าสู่ระบบที่มี lightdm หรือเช่นนั้น) คุณอาจต้องใช้WantedBy=...แทน:

[Unit]
WantedBy=graphical.target

หากคุณเบื่อที่จะให้มันทำงานกับ systemd คุณอาจต้องการดูวิธีปกติที่ผู้จัดการ X-Windows ใช้งานได้

มี~/.xprofileไฟล์ซึ่งทำงานเหมือน~/.bashrcไฟล์

นอกจากนี้ยังมี~/.config/autostart/*.desktopไฟล์ มันจะเริ่มต้นสิ่งที่แอปพลิเคชันกำหนดไว้โดยอัตโนมัติ

โซลูชันเหล่านี้ไม่ได้ครอบคลุมทั้งระบบในกรณีที่คุณมีผู้ใช้หลายคนแต่ละคนจะต้องมีรายการของตัวเอง นอกจากนี้จะไม่เริ่มต้นแอปพลิเคชันในฐานะรูท แต่คุณแทน


ในฐานะที่เป็นข้อความด้านข้างข้อความ "โหลด + ไม่ใช้งาน (ไม่ทำงาน)" หมายความว่า systemd มีเวลาที่ยากลำบากในการเริ่มต้นกระบวนการและด้วยเหตุนี้จึงตัดสินใจละทิ้งมัน คุณสามารถทดสอบด้วยตนเองว่าname.serviceทำงานได้เมื่อคุณรีบูตโดยใช้:

systemctl stop <service-name>
systemctl start <service-name>

วิธีนี้จะรีเฟรชสถานะและเริ่มบริการอย่างถูกต้องโดยถือว่าข้อมูลถูกต้อง จากนั้นคุณสามารถตรวจสอบสถานะอีกครั้งเพื่อดูรายละเอียดเพิ่มเติม:

 systemctl status <service-name>

2
หืมมมฉันลบทั้งบรรทัดนั้นและไม่มีอะไรเปลี่ยนแปลง นอกจากนี้ (อย่างที่ฉันพูดในคำถามของฉัน) มันเริ่มต้นได้ดีด้วยการเรียกใช้ systemctl start emacs)
Startec

ดูคำถามที่อัปเดตของฉัน Documentatinฉันมีพิมพ์ผิดใน คำแนะนำของคุณเกี่ยวกับjournalctlช่วยฉันที่นี่
Startec

0

มันเป็นข้อผิดพลาดในไฟล์บริการต่าง ๆ ของ Debian:

# systemctl enable watchdog
Synchronizing state of watchdog.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable watchdog
# find /etc/systemd/ | grep watch
# tail -n2 /lib/systemd/system/watchdog.service

[Install]

https://www.raspberrypi.org/forums/viewtopic.php?f=82&t=218609&p=1406567#p1406567 https://forum.armbian.com/topic/9115-still-dont-know-where-to-report -bugs-watchdogservice-ปฏิเสธการเริ่มต้นเนื่องจากการเสียบริการไฟล์ /

การแก้ไขระดับการแจกจ่ายคือการ

echo "WantedBy=default.target" >> /lib/systemd/system/watchdog.service
systemctl daemon-reexec
systemctl enable watchdog
systemctl stop watchdog.service
systemctl start watchdog.service

มีหลายทางเลือกด้วยตนเองนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.