Systemd için başlangıç ​​betiği nasıl yazılır


233

Dizüstü bilgisayarımda 2 ekran kartı var. Biri IGP ve diğeri ayrık.

Ayrı grafik kartını kapatmak için bir kabuk betiği yazdım.

Başlangıçta çalıştırmak için nasıl sistemd komut dosyasına dönüştürebilirim?

Yanıtlar:


332

Bunu yapmak için başlıca iki yaklaşım vardır:

  • Bir betiği çalıştırmanız gerekiyorsa, dönüştürmezsiniz ancak betiği bir systemdhizmet aracılığıyla çalıştırın .

Bu nedenle iki dosyaya ihtiyacınız vardır: script ve .servicedosya (birim konfigürasyon dosyası).
Komut dosyanızın çalıştırılabilir olduğundan ve ilk satırın ( shebang ) olduğundan emin olun #!/bin/sh. Sonra .servicedosyayı oluşturun /etc/systemd/system(düz bir metin dosyası, hadi arayalım vgaoff.service).
Örneğin:

  1. senaryo: /usr/bin/vgaoff
  2. birim dosya: /etc/systemd/system/vgaoff.service

Şimdi, birim dosyasını düzenleyin. İçeriği, kodunuzun nasıl çalıştığına bağlıdır:

Eğer vgaoffgpu, örneğin kapalı sadece güçler:

exec blah-blah pwrOFF etc 

o zaman içeriği vgaoff.serviceolmalı:

[Unit]
Description=Power-off gpu

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

[Install]
WantedBy=multi-user.target

Eğer vgaoffGPU kapatmak için kullanılır ve aynı zamanda bilgisayarı yeniden güç vermek için, örneğin:

start() {
  exec blah-blah pwrOFF etc
}

stop() {
  exec blah-blah pwrON etc
}

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

o zaman içeriği vgaoff.serviceolmalı:

[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
  • En önemsiz durumlar için, komut dosyası olmadan yapabilir ve doğrudan belirli bir komutu çalıştırabilirsiniz:

Kapatmak için:

[Unit]
Description=Power-off gpu

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

[Install]
WantedBy=multi-user.target

Kapatıp açmak için:

[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

Dosyalarla işiniz bittiğinde servisi etkinleştirin:

systemctl enable vgaoff.service

Bir sonraki açılışta otomatik olarak başlayacaktır. Tek seferde servisi etkinleştirip başlatabilirsiniz.

systemctl enable --now vgaoff.service

systemd v.220(eski kurulumlarda bunu manuel olarak başlatmanız gerekir) itibariyle .
Daha fazla ayrıntı için systemd.servicekılavuz sayfasına bakınız .


Sorun .
Buradan başlayın:
Bir systemdhizmetin tam günlüğünü nasıl görebilirim ?
systemdservis çıkış kodları ve durum bilgisi açıklaması


Detaylı cevap için teşekkürler. Komut "echo OFF> / sys / kernel / debug / vgaswitcheroo / switch" komutunu içeriyor
Sharique

vgaoff.service - Power-off gpu Loaded: loaded (/usr/lib/systemd/system/vgaoff.service; etkin; etkin) Aktif: başarısız (Sonuç: çıkış kodu) Sal, 11 Eyl 2012 23 tarihinden itibaren aşağıdaki mesajla başarısız olur: 46:46 + 0530; 30 sn önce İşlem: 5258 ExecStart = / usr / lib / systemd / komut dosyaları / vgaoff (kod = çıkıldı, durum = 203 / EXEC) CGroup: name = systemd: /system/vgaoff.service
Sharique

Üzgünüz, bir daha olmaz, bu küçük şeyi kaçırdım, iyi çalışıyor .. tekrar teşekkürler.
Sharique

5
@Bazon - bu mantığa göre, bu sitedeki binlerce cevap deneyimsiz kullanıcılar için "potansiyel tuzaklar" dır. Neleri bilmediği / tam olarak anlamayan kişiler echo SOMETHING > /some/file(veya gerçekte herhangi bir emir) sistemlerinde bir şeyler çalıştırmaya başlamadan önce CLI'nin temellerini öğrenmelidirler. Bu bir yana, FYI, birkaç dizüstü bilgisayar modelinde dGPU'yu nasıl kapatacağınızı okuyun , orada kullanılan komutların önerdiğiniz gibi bir şeyle değiştirilip değiştirilemeyeceğini görün. Ayrıca, orijinal dosyayı geri yüklemek için genellikle kendisine ait olan paketi yeniden yüklersiniz.
don_crissti

4
@ don_crissti whoops! Bahşiş için teşekkürler. (yanıltıcı bilgilerin yayılmasını önlemek için orijinal yorumumu sildim.)
Woodrow Barlow
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.