วิธีเขียนสคริปต์เริ่มต้นสำหรับ systemd


233

ฉันมีการ์ดกราฟิก 2 อันบนแล็ปท็อปของฉัน หนึ่งคือ IGP และอีกอย่างไม่ต่อเนื่อง

ฉันได้เขียนเชลล์สคริปต์เพื่อปิดการ์ดกราฟิกแบบแยก

ฉันจะแปลงเป็นสคริปต์ systemd เพื่อรันตอนเริ่มต้นได้อย่างไร

คำตอบ:


332

มีสองวิธีหลักในการทำเช่นนั้น:

  • หากคุณต้องเรียกใช้สคริปต์คุณจะไม่แปลง แต่ให้เรียกใช้สคริปต์ผ่านsystemdบริการ

ดังนั้นคุณต้องมีสองไฟล์: สคริปต์และ.serviceไฟล์ (ไฟล์การกำหนดค่าหน่วย)
ตรวจสอบให้แน่ใจสคริปต์ของคุณเป็นที่ปฏิบัติการและบรรทัดแรก (คนshebang ) #!/bin/shเป็น จากนั้นสร้าง.serviceไฟล์ใน/etc/systemd/system(ไฟล์ข้อความธรรมดาเรียกมันว่าvgaoff.service)
ตัวอย่างเช่น:

  1. สคริปต์: /usr/bin/vgaoff
  2. ไฟล์หน่วย: /etc/systemd/system/vgaoff.service

ตอนนี้แก้ไขไฟล์หน่วย เนื้อหาขึ้นอยู่กับการทำงานของสคริปต์ของคุณ:

ถ้าvgaoffเพียงแค่ปิด gpu เช่น:

exec blah-blah pwrOFF etc 

ดังนั้นเนื้อหาของvgaoff.serviceควรเป็น:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/usr/bin/vgaoff

[Install]
WantedBy=multi-user.target

หากvgaoffใช้เพื่อปิดการทำงานของ GPU และยังสามารถเปิดปิดได้เช่น:

start() {
  exec blah-blah pwrOFF etc
}

stop() {
  exec blah-blah pwrON etc
}

case $1 in
  start|stop) "$1" ;;
esac

ดังนั้นเนื้อหาของvgaoff.serviceควรเป็น:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/usr/bin/vgaoff start
ExecStop=/usr/bin/vgaoff stop
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
  • สำหรับกรณีที่ไม่สำคัญที่สุดคุณสามารถทำได้โดยไม่ใช้สคริปต์และดำเนินการคำสั่งบางอย่างโดยตรง:

วิธีปิดเครื่อง:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo OFF > /whatever/vga_pwr_gadget/switch"

[Install]
WantedBy=multi-user.target

วิธีปิดและเปิด:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo OFF > /whatever/vga_pwr_gadget/switch"
ExecStop=/bin/sh -c "echo ON > /whatever/vga_pwr_gadget/switch"
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

เมื่อเสร็จแล้วกับไฟล์ให้เปิดใช้งานบริการ:

systemctl enable vgaoff.service

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

systemctl enable --now vgaoff.service

จากsystemd v.220(ในการตั้งค่ารุ่นเก่าคุณจะต้องเริ่มต้นด้วยตนเอง)
สำหรับรายละเอียดเพิ่มเติมดูsystemd.serviceหน้าคู่มือ


การแก้ไขปัญหา
เริ่มที่นี่:
จะดูบันทึกการsystemdบริการได้อย่างไร
systemdรหัสทางออกของบริการและคำอธิบายข้อมูลสถานะ


ขอบคุณสำหรับคำตอบโดยละเอียด สคริปต์ประกอบด้วยหนึ่งคำสั่ง "echo OFF> / sys / kernel / debug / vgaswitcheroo / switch"
Sharique

มันล้มเหลวด้วยข้อความต่อไปนี้ vgaoff.service - gpu การปิดเครื่องโหลด: โหลด (/usr/lib/systemd/system/vgaoff.service เปิดใช้งาน) ใช้งาน: ล้มเหลว (ผลลัพธ์: รหัสออก) ตั้งแต่อังคาร, 11 ก.ย. 2012 23: 46:46 +0530; 30 วินาทีที่ผ่านมากระบวนการ: 5258 ExecStart = / usr / lib / systemd / สคริปต์ / vgaoff (รหัส = ออกจากสถานะ = 203 / EXEC) CGroup: ชื่อ = systemd: /system/vgaoff.service
Sharique

อ๊ะไม่ใช่อีกครั้งฉันพลาดสิ่งเล็ก ๆ นี้มันทำงานได้ดี .. ขอบคุณอีกครั้ง
Sharique

5
@Bazon - ตามตรรกะนี้คำตอบมากมายในเว็บไซต์นี้คือ "กับดักที่มีศักยภาพ" สำหรับผู้ใช้ที่ไม่มีประสบการณ์ ผู้ที่ไม่ทราบ / เข้าใจอย่างถ่องแท้ว่าอะไรecho SOMETHING > /some/file(หรือคำสั่งอื่นใดตามความเป็นจริง) ควรทำความคุ้นเคยกับพื้นฐานของ CLI ก่อนที่จะพยายามเรียกใช้เนื้อหาบนระบบของพวกเขา นอกเหนือจากนั้น FYI อ่านวิธีปิด dGPU ในแล็ปท็อปหลายรุ่นดูว่าคำสั่งที่ใช้มีอาจถูกแทนที่ด้วยสิ่งที่คุณแนะนำ นอกจากนี้ในการกู้คืนไฟล์ต้นฉบับคุณมักจะติดตั้งแพคเกจที่เป็นเจ้าของ
don_crissti

4
@don_crissti อ๊ะ! ขอบคุณสำหรับทิป. (ลบความคิดเห็นดั้งเดิมของฉันเพื่อหลีกเลี่ยงการเผยแพร่ข้อมูลที่ทำให้เข้าใจผิด)
Woodrow Barlow
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.