[สิ่งนี้ไม่ได้แก้ไขปัญหาของ 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
มีรายละเอียดเพิ่มเติม