วิธีเขียนไฟล์ systemd .service ที่รัน systemd-tmpfiles


16

ฉันจำเป็นต้องเรียกใช้systemd-tmpfiles --createในระหว่างกระบวนการบูตด้วย systemd distro ดังนั้นฉันต้องสร้างไฟล์ systemd .service ให้ทำงานนี้

ในคำถามนี้คุณสามารถอ่านรายละเอียดทั้งหมดเกี่ยวกับสิ่งที่ฉันต้องการและทำไม: systemd-tmpfiles ทำงานอย่างไร

ฉันได้อ่านเอกสารเกี่ยวกับเรื่องนี้แล้วและฉันกำลังเขียนแบบทดสอบต่อไปนี้:

[Unit]
Description=Execute tmpfiles to disable usb-wakeup # see details in the link above
Requires=multi-user.target # see details in the link above
After=multi-user.target    # see details in the link above

[Service]
Type=oneshot
ExecStart=/usr/bin/systemd-tmpfiles --create

[Install]
WantedBy=multi-user.target

แต่ฉันไม่แน่ใจเพราะsystemd-tmpfilesไม่ใช่โปรแกรมที่ง่าย แต่เป็น systemd บางส่วน ฉันไม่ต้องการที่จะทำลายระบบของฉัน

มีเคล็ดลับเกี่ยวกับไฟล์. service หรือไม่


ตรวจสอบเอกสารมากมายใน systemd ที่freedesktop.org/wiki/Software/systemd คุณสามารถลบล้างค่าเริ่มต้นของระบบด้วยไฟล์ของคุณเอง
vonbrand

คำตอบ:


30

[สิ่งนี้ไม่ได้แก้ไขปัญหาของ systemd-tmpfiles โดยตรง แต่ฉันคิดว่าคุณได้รับการยอมรับแล้วว่าในกรณีนี้คุณดีกว่าการใช้ echo]

ก่อนอื่น "multi-user.target" อาจใช่หรือไม่ใช่สิ่งที่คุณต้องการใช้ หากคุณคุ้นเคยกับแนวคิดของ runlevel จาก SysV style init stuff ผู้ใช้หลายคนนั้นเทียบเท่ากับ systemd ของ runlevel 3 ซึ่งเป็นระบบที่มีผู้ใช้หลายคนที่บูทเข้ากับคอนโซลไม่ใช่ GUI สิ่งที่เทียบเท่ากับ runlevel 5 ซึ่งใช้บู๊ตเป็น X เป็นแบบกราฟิกเป้าหมาย เริ่มต้นจะถูกกำหนดโดย symlink ใน/etc/systemd/system(และ / หรือ/lib/systemd/system; หนึ่งใน/etcจะลบล้างหนึ่งใน/lib) ที่เรียกว่าdefault.targetใช้ ls เพื่อหาที่มันชี้ไปที่:

»ls -l /etc/systemd/system/default.target
default.target -> /usr/lib/systemd/system/multi-user.target

สำหรับเดสก์ท็อป linux ปกติจะเป็นแบบกราฟิกเป้าหมาย สิ่งนี้ไม่สำคัญถ้าคุณต้องการให้บริการการบู๊ตที่คุณสร้างขึ้นเพื่อเริ่มต้นโดยไม่คำนึงว่า runlevel / target เริ่มต้นคืออะไรในกรณีนี้เราสามารถใช้ default.target และไม่ต้องกังวลว่าจะใช้นามแฝงอะไร ถ้าคุณใช้ผู้ใช้หลายคนและค่าเริ่มต้นของคุณเป็นกราฟิกบริการของคุณจะไม่เกิดขึ้น

ขึ้นอยู่กับบริการอาจมีเป้าหมายหรือบริการที่เหมาะสมและเฉพาะเจาะจงมากขึ้นซึ่งคุณต้องการเริ่มบริการนี้ที่เกี่ยวข้อง ตามคำถามอื่นของคุณ default.target อาจใช้ได้ ตามหมายเหตุความแตกต่างระหว่าง "เป้าหมาย" และ "บริการ" คือบริการมี[Service]ส่วนที่จริงเรียกใช้กระบวนการ เป้าหมายเป็นเพียงวิธีการรวมกลุ่มบริการต่างๆเข้าด้วยกันผ่านคำสั่ง "พึ่งพา" และ "ต้องการ" มันไม่ได้ทำอะไรที่เป็นของตัวเองเลยนอกจากการกระตุ้นเป้าหมายหรือบริการอื่น ๆ

เมื่อบริการเริ่มต้นจะถูกกำหนดโดยบริการอื่นใดขึ้นอยู่กับบริการนั้นอย่างชัดเจน ในกรณีของเหตุการณ์แบบเรียบง่ายแบบสแตนด์อะโลนที่เราต้องการให้ทำงานช้าในกระบวนการบู๊ตเราสามารถใช้ชุดคำสั่งนี้:

[Unit]
After=default.target

[Install]
WantedBy=default.target

ส่วน "ติดตั้ง" จะใช้เมื่อติดตั้งบริการ "WantedBy" ระบุเป้าหมายที่เราต้องการให้บริการนี้รวมอยู่ด้วย (หมายถึงมันจะทำงานหากเป้าหมายนั้นทำ แต่ nb. สิ่งนี้ไม่ได้กำหนดว่าจะให้บริการเมื่อใดที่เกี่ยวข้องกับบริการอื่น ) เนื่องจากเราต้องการให้บริการนี้ทำงานได้ในภายหลังแทนที่จะเร็วกว่านั้นเราจึงระบุประโยค "After" สิ่งนี้ไม่จำเป็นต้องเหมือนกับเป้าหมาย WantedBy (โดยปกติแล้วไม่ใช่) และสามารถละเว้นได้อย่างสมบูรณ์หากคุณไม่สนใจเมื่อเกิดขึ้น ฉันแค่ใช้มันในลางสังหรณ์ว่าสิ่งอื่น ๆ ส่วนใหญ่จะทำงานเกี่ยวข้องกับสิ่งที่ถูกล่ามโซ่กับบางสิ่งบางอย่างที่ระบุไว้Before=default.target(ซึ่งเราสามารถใช้งานได้; ความต้องการของเป้าหมายจะถูกประเมินก่อนที่เป้าหมายจะทำงาน)

ตัวอย่างเช่นฉันจะสะท้อน "สวัสดีโลก" กับคอนโซล บริการอธิบายไว้ใน[Service]ส่วน:

[Service]
Type=forking
ExecStart=/usr/local/bin/helloworld

คำสั่งต้องการพา ธ เต็ม เหตุผลที่ฉันไม่ได้ใช้เพียง/usr/bin/echo "hello world"เพราะมันไม่ทำงาน (ผลลัพธ์ไปที่ / dev / null ฉันคิดว่า) และในขณะที่บริการที่ทำตามความecho "hello world" > /dev/consoleต้องการการทดลองแสดงให้เห็นว่าการใช้การเปลี่ยนเส้นทางเชลล์ในคำสั่ง ExecStart จะไม่ . ดังนั้น / usr / local / bin / HelloWorld echo "hello world" > /dev/consoleเป็นสคริปต์เปลือกหนึ่งบรรทัดนั้น

จดบันทึกType=forkingซึ่งจำเป็นสำหรับเชลล์สคริปต์

เสร็จสมบูรณ์ไฟล์บริการน้อยที่สุดของเราเป็นเพียงผู้สามส่วน ( [Unit], [Service]และ[Install]) หากต้องการติดตั้งให้วางไฟล์หรือ symlink ลงใน / etc / systemd / system หรือ / usr / lib / systemd / system และ:

systemctl --system enable helloworld

ln -s ...มันควรพิมพ์ สิ่งนี้ไม่ได้เรียกใช้บริการเพียงแค่กำหนดค่าให้เรียกใช้เมื่อเริ่มระบบตามที่กล่าวไว้ข้างต้น

นั่นคือสรุป man systemd.unitและman systemd.serviceมีรายละเอียดเพิ่มเติม


1
ขอบคุณคำตอบที่เป็นประโยชน์และแก้ปัญหาได้ดีมาก เพียงแค่บันทึกใน distro ของฉัน (Chakra Linux) default.targetไม่ได้อยู่ใน/etc/systemd/systemแต่มันก็เป็นเพียงใน/usr/lib/systemd/system
Eang

เอาต์พุตจากคำสั่งจะถูกบันทึก (ไม่สามารถไปได้อีก)
vonbrand

ไฟล์ / usr / lib / systemd / ... เป็นทางเลือก (ค่าเริ่มต้น) คุณควรจะวางไฟล์ของคุณไว้ใน / etc / systemd / ...
vonbrand

วันนี้default.targetสามารถพบได้ใน/lib/systemd/system/default.target
czerasz

1
@czerasz ฉันสังเกตเห็นว่า Fedora 27 ถ้าฉัน systemctl set-default ...ออกจาก symlink /etc/systemd/systemแต่มันไม่ได้เปลี่ยนสิ่งใดสิ่งหนึ่ง/libนั่นคือพวกเขาชี้ไปที่เป้าหมายที่แตกต่างกัน แต่สิ่งที่ในอดีตควรแทนที่หลัง หากคุณตั้งไว้ด้วยตัวเองนั่นคือสิ่งที่อาจเกิดขึ้น อย่างไรก็ตามฉันได้แก้ไขทั้งสองที่แล้ว
goldilocks

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