Cách viết script khởi động cho systemd


233

Tôi có 2 card đồ họa trên laptop. Một là IGP và một cái khác rời rạc.

Tôi đã viết một kịch bản shell để tắt card đồ họa rời.

Làm cách nào tôi có thể chuyển đổi nó thành tập lệnh systemd để chạy nó khi khởi động?

Câu trả lời:


332

Có hai cách tiếp cận chủ yếu để làm điều đó:

  • Nếu bạn phải chạy tập lệnh, bạn không chuyển đổi tập lệnh mà chỉ chạy tập lệnh qua systemddịch vụ.

Do đó, bạn cần hai tệp: tập lệnh và .servicetệp (tệp cấu hình đơn vị).
Hãy chắc chắn rằng tập lệnh của bạn có thể thực thi được và dòng đầu tiên ( shebang ) là #!/bin/sh. Sau đó tạo .servicetệp trong /etc/systemd/system(một tệp văn bản đơn giản, hãy gọi nó vgaoff.service).
Ví dụ:

  1. kịch bản: /usr/bin/vgaoff
  2. tập tin đơn vị: /etc/systemd/system/vgaoff.service

Bây giờ, chỉnh sửa tập tin đơn vị. Nội dung của nó phụ thuộc vào cách tập lệnh của bạn hoạt động:

Nếu vgaoffchỉ tắt nguồn gpu, vd:

exec blah-blah pwrOFF etc 

thì nội dung của vgaoff.servicenên là:

[Unit]
Description=Power-off gpu

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

[Install]
WantedBy=multi-user.target

Nếu vgaoffđược sử dụng để tắt nguồn GPU và cũng để bật lại nguồn, ví dụ:

start() {
  exec blah-blah pwrOFF etc
}

stop() {
  exec blah-blah pwrON etc
}

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

thì nội dung của vgaoff.servicenên là:

[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
  • Đối với các trường hợp tầm thường nhất, bạn có thể thực hiện mà không cần tập lệnh và thực thi trực tiếp một lệnh nhất định:

Tắt nguồn:

[Unit]
Description=Power-off gpu

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

[Install]
WantedBy=multi-user.target

Tắt và bật nguồn:

[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

Khi bạn đã hoàn tất các tệp, hãy bật dịch vụ:

systemctl enable vgaoff.service

Nó sẽ tự động bắt đầu vào lần khởi động tiếp theo. Bạn thậm chí có thể kích hoạt và bắt đầu dịch vụ trong một lần với

systemctl enable --now vgaoff.service

kể từ systemd v.220(trên các thiết lập cũ hơn, bạn sẽ phải khởi động thủ công).
Để biết thêm chi tiết xem systemd.servicetrang hướng dẫn.


Xử lý sự cố .
Bắt đầu ở đây:
Làm thế nào để xem nhật ký đầy đủ của một systemddịch vụ?
systemdmã thoát dịch vụ và giải thích thông tin trạng thái


Cảm ơn câu trả lời chi tiết. Các kịch bản có chứa một lệnh "echo OFF> / sys / kernel / debug / vgaswitcheroo / switch"
Sharique

nó không thành công với thông báo sau vgaoff.service - Tắt nguồn gpu Đã tải: đã tải (/usr/lib/systemd/system/vgaoff.service; đã bật) Hoạt động: thất bại (Kết quả: mã thoát) kể từ Thứ ba, ngày 11 tháng 9 năm 2012 23: 46:46 +0530; 30 giây trước Quá trình: 5258 ExecStart = / usr / lib / systemd / scripts / vgaoff (code = exited, status = 203 / EXEC) Cgroup: name = systemd: /system/vgaoff.service
Sharique

Rất tiếc, không phải lần nữa, tôi đã bỏ lỡ điều nhỏ nhặt này, nó đang hoạt động tốt .. cảm ơn một lần nữa.
Sharique

5
@Bazon - theo logic này, hàng ngàn câu trả lời trên trang web này là "bẫy tiềm năng" cho người dùng thiếu kinh nghiệm. Những người không biết / hoàn toàn hiểu những gì echo SOMETHING > /some/file(hoặc bất kỳ lệnh nào khác là vấn đề thực tế) nên làm quen với những điều cơ bản của CLI trước khi thử chạy mọi thứ trên hệ thống của họ. Ngoài ra, FYI, hãy đọc cách tắt dGPU trên một số mẫu máy tính xách tay, xem các lệnh được sử dụng ở đó có thể được thay thế bằng thứ gì đó như bạn đề xuất không. Ngoài ra, để khôi phục tập tin gốc, bạn thường cài đặt lại gói sở hữu nó.
don_crissti

4
@don_crissti Rất tiếc! cảm ơn vì tiền hỗ trợ. (đã xóa nhận xét ban đầu của tôi để tránh lan truyền thông tin sai lệch.)
Woodrow Barlow
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.