Cara menulis skrip startup untuk systemd

233

Saya memiliki 2 kartu grafis di laptop saya. Satu adalah IGP dan satu lagi terpisah.

Saya telah menulis skrip shell untuk mematikan kartu grafis diskrit.

Bagaimana saya bisa mengubahnya menjadi skrip systemd untuk menjalankannya saat start-up?

Sharique
sumber

Jawaban:

332

Ada dua pendekatan utama untuk melakukan itu:

  • Jika Anda harus menjalankan skrip, Anda tidak mengonversinya melainkan menjalankan skrip melalui systemdlayanan.

Karena itu Anda memerlukan dua file: skrip dan .servicefile (file konfigurasi unit).
Pastikan skrip Anda dapat dieksekusi dan baris pertama ( shebang ) adalah #!/bin/sh. Kemudian buat .servicefile dalam /etc/systemd/system(file teks biasa, sebut saja vgaoff.service).
Sebagai contoh:

  1. naskah: /usr/bin/vgaoff
  2. file unit: /etc/systemd/system/vgaoff.service

Sekarang, edit file unit. Isinya tergantung pada cara kerja skrip Anda:

Jika vgaoffhanya mematikan gpu, misalnya:

exec blah-blah pwrOFF etc 

maka isi vgaoff.serviceharus:

[Unit]
Description=Power-off gpu

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

[Install]
WantedBy=multi-user.target

Jika vgaoffdigunakan untuk mematikan GPU dan juga untuk menghidupkan kembali, misalnya:

start() {
  exec blah-blah pwrOFF etc
}

stop() {
  exec blah-blah pwrON etc
}

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

maka isi vgaoff.serviceharus:

[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
  • Untuk sebagian besar kasus sepele, Anda dapat melakukannya tanpa skrip dan menjalankan perintah tertentu secara langsung:

Untuk mematikan:

[Unit]
Description=Power-off gpu

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

[Install]
WantedBy=multi-user.target

Untuk mematikan dan menghidupkan:

[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

Setelah selesai dengan file, aktifkan layanan:

systemctl enable vgaoff.service

Ini akan mulai secara otomatis pada boot berikutnya. Anda bahkan dapat mengaktifkan dan memulai layanan sekaligus

systemctl enable --now vgaoff.service

pada systemd v.220(pada setup yang lebih tua Anda harus memulainya secara manual).
Untuk lebih jelasnya lihat systemd.servicehalaman manual.


Pemecahan masalah .
Mulai di sini:
Bagaimana cara melihat log lengkap systemdlayanan?
systemdkode keluar layanan dan penjelasan informasi status

don_crissti
sumber
Terima kasih atas jawaban terinci. Skrip berisi satu perintah "echo OFF> / sys / kernel / debug / vgaswitcheroo / switch"
Sharique
gagal dengan pesan berikut vgaoff.service - Power-off gpu Loaded: loaded (/usr/lib/systemd/system/vgaoff.service; diaktifkan) Aktif: gagal (Hasil: kode-keluar) sejak Selasa, 11 Sep 2012 23: 46:46 +0530; 30d lalu Proses: 5258 ExecStart = / usr / lib / systemd / script / vgaoff (kode = keluar, status = 203 / EXEC) CGroup: name = systemd: /system/vgaoff.service
Sharique
oops, tidak lagi, saya melewatkan hal kecil ini, itu berfungsi dengan baik .. terima kasih lagi.
Sharique
5
@Bazon - menurut logika ini, ribuan jawaban di situs ini adalah "jebakan potensial" bagi pengguna yang tidak berpengalaman. Orang-orang yang tidak tahu / tidak sepenuhnya memahami apa yang echo SOMETHING > /some/filedilakukan (atau perintah lain apa pun sebenarnya) harus membiasakan diri dengan dasar-dasar CLI sebelum mencoba menjalankan hal-hal pada sistem mereka. Selain itu, FYI, baca cara mematikan dGPU pada beberapa model laptop, lihat apakah perintah yang digunakan di sana dapat diganti dengan sesuatu seperti yang Anda sarankan. Juga, untuk mengembalikan file asli, Anda biasanya menginstal ulang paket yang memilikinya.
don_crissti
4
@don_crissti whoops! terima kasih atas tipnya. (menghapus komentar asli saya untuk menghindari penyebaran informasi yang menyesatkan.)
Woodrow Barlow