Systemd: วิธีการทำให้บริการ systemd เริ่มต้นหลังจากเชื่อมต่อเครือข่ายอย่างสมบูรณ์?


12

พื้นหลัง

ฉันกำลังเขียนสคริปต์อย่างง่าย ๆ เพื่อให้ทำงานใน Raspbain บน Raspberry Pi 2 ให้เปิดไฟ LED เพื่อระบุว่าฉันพร้อมที่จะเชื่อมต่อกับ SSH จากคอมพิวเตอร์เดสก์ท็อปของฉัน

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

[Unit]
Description=Turn on LED after SSH is ready

[Service]
Type=idle
ExecStart=/usr/bin/sshready.py

[Install]
Wants=network-online.target
After=network-online.target

ผล

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

$ systemd-analyze plot > output.svg

ผลแสดงให้เห็น

ป้อนคำอธิบายรูปภาพที่นี่

คำถาม

ดูเหมือนว่าบริการของฉันจะไม่เริ่มหลังจากnetwork-online.targetเกิดอะไรขึ้นที่นี่และฉันจะแก้ไขได้อย่างไร

คำตอบ:


12

เมื่อมีคำถามเกี่ยวกับคำสั่ง systemd คุณสามารถใช้man systemd.directivesเพื่อค้นหาว่าเอกสารนั้นอยู่ที่ไหน ในกรณีนี้มันแสดงให้เห็นว่าการบันทึกไว้ในAfter=man systemd.unit

ในไฟล์ดังกล่าวจะแสดงว่าAfter=คำสั่งนั้นมีการระบุไว้ใน "[UNIT] SECTION OPTIONS" ซึ่งบ่งบอกว่ามันอยู่ใน[Unit]ส่วนของไฟล์

เอกสารเดียวกันนี้ยังรวมถึงตัวเลือกส่วน [INSTALL] และAfter=ไม่อยู่ในรายการ

กล่าวโดยย่อคือAfter=คำสั่งของคุณอยู่ในตำแหน่งที่ไม่ถูกต้องของไฟล์หน่วยดังนั้นจึงไม่มีผลกระทบใด ๆ จนกว่าคุณจะย้ายไฟล์ไปยังตำแหน่งที่ถูกต้อง


เพื่อความชัดเจนในกรณีนี้ "[หน่วย]" คือ "[บริการ]" เนื่องจากเป็นไฟล์บริการ
faho

คำตอบที่คัดลอกได้พร้อมกับการแก้ไขน่าจะดีกว่า!
GerardJP

@GerardJP ดีกว่าที่จะสอนให้คนตกปลาแล้วให้อาหารเขาสักวัน เมื่อคนรู้วิธีการใช้เอกสาร systemd พวกเขาสามารถหาคำตอบที่เชื่อถือได้โดยไม่ต้องเสียเวลากับ StackExchange โดยดูที่เอกสารของบุคคลที่สาม
Mark Stosberg

11

มีการแก้ไขโดยการปรับเปลี่ยนการบริการเป็น

[Unit]
Description=Turn on LED after SSH is ready
After=network-online.target

[Service]
Type=idle
ExecStart=/usr/bin/sshready.py

[Install]
WantedBy=network-online.target

ยังไม่เข้าใจสิ่งที่ฉันทำอย่างเต็มที่ แต่ตอนนี้ใช้งานได้ ใครช่วยอธิบายหน่อยได้ไหม

ปรับปรุง

คำตอบนี้ถูกสร้างขึ้นด้วยตัวเองก่อนที่คำตอบที่ยอมรับจะมา


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