คุณจะทำให้บริการ systemd เป็นบริการสุดท้ายในการบูตได้อย่างไร


26

/etc/rc.localหลายปีที่ผ่านมาเราสามารถเขียนสคริปต์การเริ่มต้นของเราใน หลังจากโหลดบริการระบบทั้งหมดแล้วสคริปต์ของคุณจะทำงาน

ตอนนี้เราใช้ systemd เราไม่มีrc.localอีกแล้ว Systemd เริ่มบริการแบบขนาน คุณสามารถเขียนบริการของคุณเองเพื่อทำหน้าที่ rc.local` แต่คุณไม่สามารถมั่นใจได้ว่ามันจะทำงานหลังจากที่โหลดระบบบริการทั้งหมดแล้ว

มีวิธีทำหรือไม่? หรือเราต้องใช้BeforeและAfterในไฟล์บริการ systemd?



5
Systemd ไม่พุ่งพรวด !!
比尔盖子

ระบุชื่อและเวอร์ชั่นของระบบปฏิบัติการหรือไม่
STTR

ระบบปฏิบัติการ: Arch Linux, เวอร์ชัน: N / A
比尔盖子

1
@ 比尔盖子ทำไม "สุดท้าย" คุณไม่รู้จักการพึ่งพาของสคริปต์หรือคุณต้องการให้มันปลอดภัยหรือไม่
Paul

คำตอบ:


27

ใน systemd ขอแนะนำให้ใช้Before=และAfter=สั่งซื้อบริการของคุณอย่างอื่น ๆ

แต่เมื่อคุณขอวิธีโดยไม่ใช้BeforeและAfterคุณสามารถใช้:

Type=idle

ซึ่งman systemd.serviceอธิบาย:

พฤติกรรมของidleคล้ายกันมากกับsimple; อย่างไรก็ตามการเรียกใช้งานจริงของโปรแกรมบริการจะล่าช้าจนกว่างานทั้งหมดจะถูกจัดส่ง สิ่งนี้อาจถูกใช้เพื่อหลีกเลี่ยงการสอดแทรกเอาต์พุตของเชลล์เซอร์วิสด้วยเอาต์พุตสถานะบนคอนโซล โปรดทราบว่าประเภทนี้มีประโยชน์ในการปรับปรุงเอาต์พุตคอนโซลเท่านั้นมันไม่ได้มีประโยชน์ในฐานะเครื่องมือสั่งซื้อหน่วยทั่วไปและผลกระทบของประเภทบริการนี้จะขึ้นอยู่กับการหมดเวลา 5 วินาทีหลังจากที่เรียกใช้บริการโปรแกรมแล้ว


1
สวัสดีคุณสนใจที่จะอธิบายรายละเอียดของไวยากรณ์ถ้าฉันจะใช้ก่อนหรือหลัง?
r4ccoon

ค่อนข้างแตกต่างกัน แต่ถ้ามีคนต้องการเรียกใช้กระบวนการผู้ใช้แยกต่างหากจากกระบวนการของระบบมีaskubuntu.com/a/859583/457417
Ben Creasy

ทำงานได้อย่างสมบูรณ์แบบชุด/proc/sys/kernel/modules_disabledไป1ในตอนท้ายของกระบวนการบูต
สจ๊วร์ Cardall

0

มันขึ้นอยู่กับนิยามของคำว่า "booted" ของคุณ ฉันคิดว่าคุณต้องการให้มันทำงานทันทีหลังจากเริ่มเก็ตตี้ ในการทำเช่นนี้คุณจะต้องเพิ่มบริการของคุณลงใน/etc/systemd/system/getty.target.wants/ไดเรกทอรี คุณควรตรวจสอบให้แน่ใจว่าไฟล์ของคุณใช้รหัสที่คล้ายคลึงกับบริการอื่น ๆ ในไดเรกทอรีนี้ หากต้องการเรียกใช้บริการที่กำหนดเองในการบูทและปิดเครื่อง (เพียงส่งเสียงบี๊บเมนบอร์ดของฉัน) ฉันใช้สคริปต์ต่อไปนี้ใน/etc/systemd/system/getty.target.wants/service_name.service

[Unit]
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service
Before=getty.target
IgnoreOnIsolate=yes

[Service]
ExecStart=/usr/bin/myinitscript.sh start
ExecStop=/usr/bin/myinitscript.sh stop
Type=oneshot
RemainAfterExit=true

[Install]
WantedBy=basic.target

/usr/bin/myinitscript.sh สามารถใช้งานได้และมี Shebang ตั้งแต่เริ่มต้น

โปรดทราบว่าไม่ใช่ทุกอย่างที่จะเริ่มต้นที่จุดนี้ในการบู๊ต แต่นี่คือจุดที่พร้อมท์การเข้าสู่ระบบปรากฏต่อผู้ใช้

แม้ว่าจะใช้Before=และAfter=มันก็เป็นที่เข้าใจและใช้งานได้จริงสำหรับฉัน ฉันไม่พบคำตอบที่ให้ข้อมูลเพียงพอ นอกจากนี้ยังช่วยให้คุณสามารถใช้ทั้งสองอย่างExecStart=และExecStop=แทนที่จะ จำกัด เฉพาะType=simpleบริการที่เหมือนกัน


-2

ฉันไม่คุ้นเคยกับข้อมูลเฉพาะหรือ ArchLinux แต่นี่คือวิธีจัดการ systemd โดยทั่วไป

โดยทั่วไป systemd คือชุดของสคริปต์ใน /etc/init.d/ ซึ่งชี้โดย symlinks จาก /etc/rcX.d โดยที่ X คือจำนวนของระดับการรัน Symlink เป็นรูปแบบต่อไปนี้:

[K | S] + nn + [สตริง]

ที่อยู่:

  • nnคือตัวเลขที่กำหนดลำดับที่สคริปต์เหล่านั้นทำงาน
  • stringเป็นชื่อของสคริปต์ตามที่ปรากฏใน /etc/init.d/
  • และในที่สุด K หรือ S จะพิจารณาคำสั่งที่สคริปต์ถูกเรียกใช้ด้วย: stop หรือ start ตามลำดับ

ดังนั้นหากคุณต้องการให้สคริปต์รันล่าสุดในลำดับการบู๊ตคุณต้องทำสิ่งต่อไปนี้:

  1. ใส่สคริปต์ของคุณใน /etc/init.d/ และทำให้มันปฏิบัติ
  2. กำหนดเป้าหมายระดับ runlevel สคริปต์ควรเริ่มต้นที่ (tipically 2 สำหรับคอนโซลและ 5 สำหรับส่วนติดต่อผู้ใช้แบบกราฟิก) สามารถกำหนดด้วยสิ่งที่ชอบrunlevel
  3. ดูที่สคริปต์ที่มีอยู่ใน runlevel นี้ls /etc/rc<target runlevel>.d/แล้วเลือกตัวเลขสองหลักที่มากกว่าเลขอื่น ๆ ที่มีอยู่แล้ว
  4. ใช้ยูทิลิตีเฉพาะสำหรับการแจกจ่ายของคุณเช่นupdate-rc.dDebian หรือchkconfigFedora-like หรือแบบแมนนวลสร้าง symlink /etc/rc.d/S ไปยังสคริปต์ init ของคุณ

5
สิ่งที่คุณอธิบายคือ sysVinit จริง ๆ ในขณะที่มันเป็นความจริงที่ systemd เข้ากันได้กับวิธีการทำงานของ sysVinit มีความแตกต่างที่สำคัญอย่างหนึ่ง - ทุกอย่างถูกดำเนินการควบคู่ นอกจากนี้ยังมีบริการสองประเภทบริการ sysVinit และบริการ systemd คำตอบของคุณอาจช่วยให้สิ่งที่ดำเนินการหลังจากบริการ sysVinit แต่ไม่จำเป็นต้อง systemd คน
Sam

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