Sistem hizmetlerini nasıl geçersiz kılabilir veya yapılandırabilirim?


109

Birçok sysv init komut dosyası /etc/default, yöneticinin onu yapılandırmasına izin vermek için karşılık gelen bir dosya kullandı . Başlatma işleri .overridedosyalar kullanılarak değiştirilebilir . Sistemd birimlerini nasıl geçersiz kıldım veya yapılandırabilirim, şimdi sistemd Ubuntu'da varsayılandır.


ExecStart=Boş bir girişi temizlerken, şu şekilde yorum yapamayacağınızı unutmayın: ExecStart= # Empty line to clear previous entries.Bu, başka bir ExecStart=giriş olarak alınacak ve listeye eklenecektir. PS. İtibarım yüzünden muru cevabına yorum ekleyemedim.
Ağustos'ta tysik

Yanıtlar:


185

systemdbirimlerin dosyalara uyması gerekmez /etc/default. systemdkolayca yapılandırılabilir, ancak systemd birim dosyalarının sözdizimini bilmenizi gerektirir.

Paketler birim dosyalarını genellikle içinde gönderir /lib/systemd/system/. Bunlar değil düzenlenebilir için. Bunun yerine, systemdiçinde uygun dosyalar oluşturarak bu dosyaları geçersiz kılmanıza olanak sağlar /etc/systemd/system/.

Belirli bir hizmet fooiçin paket sağlayacaktır /lib/systemd/system/foo.service. Kullanarak durumunu kontrol edebilir systemctl status fooveya kullanarak kayıtlarını görüntüleyebilirsiniz journalctl -u foo. Tanımındaki bir şeyi geçersiz kılmak fooiçin:

sudo systemctl edit foo

Bu /etc/systemd/system, birimin adında bir dizin ve override.confbu dizinde ( /etc/systemd/system/foo.service.d/override.conf) bir dosya oluşturur . Bu dosyayı (veya içindeki diğer .confdosyaları /etc/systemd/system/foo.service.d/) kullanarak ayarları ekleyebilir veya geçersiz kılabilirsiniz .

Komut argümanlarını geçersiz kılma

Mesela gettyservisi ele alalım. Diyelim ki kullanıcıma TTY2 otolog yaptırmak istiyorum (bu tavsiye edilmez, sadece bir örnek). TTY2 getty@tty2servis tarafından çalıştırılır ( tty2şablonun bir örneği /lib/systemd/system/getty@service). Bunu yapmak için getty@tty2servisi değiştirmem gerekiyor .

$ systemctl cat getty@tty2
# /lib/systemd/system/getty@.service
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Getty on %I
Documentation=man:agetty(8) man:systemd-getty-generator(8)
Documentation=http://0pointer.de/blog/projects/serial-console.html
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service

# If additional gettys are spawned during boot then we should make
# sure that this is synchronized before getty.target, even though
# getty.target didn't actually pull it in.
Before=getty.target
IgnoreOnIsolate=yes

# On systems without virtual consoles, don't start any getty. Note
# that serial gettys are covered by serial-getty@.service, not this
# unit.
ConditionPathExists=/dev/tty0

[Service]
# the VT is cleared by TTYVTDisallocate
ExecStart=-/sbin/agetty --noclear %I $TERM
Type=idle
Restart=always
RestartSec=0
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
KillMode=process
IgnoreSIGPIPE=no
SendSIGHUP=yes

# Unset locale for the console getty since the console has problems
# displaying some internationalized messages.
Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION=

[Install]
WantedBy=getty.target
DefaultInstance=tty1

Özellikle ExecStartşu anda olan çizgiyi değiştirmem gerekiyor :

$ systemctl cat getty@tty2 | grep Exec     
ExecStart=-/sbin/agetty --noclear %I $TERM

Bunu geçersiz kılmak için:

sudo systemctl edit getty@tty2

Ve Ekle:

[Service]
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM

Bunu not et:

  1. Ben açıkça anlaşılır zorunda ExecStarto benzer bir katkı ayardır olarak, yeniden ayarlamadan önce After, Environment(bir bütün olarak değil başına değişken) ve EnvironmentFilebenzeri ayarlarını geçersiz için ve karşı RestartSecveya Type. ExecStartyalnızca Type=oneshotservisler için birden fazla giriş olabilir .
  2. Uygun bölüm başlığını kullanmak zorunda kaldım. Orijinal dosyada, ExecStartbu [Service]bölümde var, bu yüzden geçersiz kılmam ExecStartbu [Service]bölümü de koymak zorunda . Genelde, kullanılan servis dosyasına bir göz atmak, systemctl catneleri geçersiz kılmanız gerektiğini ve hangi bölümde olduğunu size söyler.

Genellikle, bir sistem birimi dosyasını düzenlerseniz, geçerli olması için çalıştırmanız gerekir:

sudo systemctl daemon-reload

Ancak systemctl editbunu otomatik olarak sizin için yapar.

Şimdi:

$ systemctl cat getty@tty2 | grep Exec
ExecStart=-/sbin/agetty --noclear %I $TERM
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM

$ systemctl show getty@tty2 | grep ExecS
ExecStart={ path=/sbin/agetty ; argv[]=/sbin/agetty -a muru --noclear %I $TERM ; ... }

Ve eğer yaparsam:

sudo systemctl restart getty@tty2

ve basın CtrlAltF2, presto! O TTY hesabıma giriş yapacağım.

Daha önce de söylediğim getty@tty2gibi, bir şablon örneğidir. Peki, bu şablonun tüm örneklerini geçersiz kılmak istersem? Bu, şablonun kendisini düzenleyerek yapılabilir (örnek tanımlayıcısını kaldırma - bu durumda tty2):

systemctl edit getty@

Çevre geçersiz kılma

Sık kullanılan bir /etc/defaultdosya kullanımı ortam değişkenleridir. Genellikle, /etc/defaultbir kabuk betiğidir, bu nedenle içinde kabuk dili yapıları kullanabilirsiniz. Bununla systemdbirlikte, durum böyle değil. Ortam değişkenlerini iki yolla belirleyebilirsiniz:

Bir dosya aracılığıyla

Ortam değişkenlerini bir dosyada belirlediğinizi varsayalım:

$ cat /path/to/some/file
FOO=bar

Ardından, geçersiz kılmaya ekleyebilirsiniz:

[Service]
EnvironmentFile=/path/to/some/file

Özellikle, /etc/default/grubyalnızca ödevler içeriyorsa ve kabuk sözdizimi yoksa, olarak kullanabilirsiniz EnvironmentFile.

Via Environmentgirdileri

Yukarıdakiler aşağıdaki geçersiz kılma kullanılarak da gerçekleştirilebilir:

[Service]
Environment=FOO=bar

Ancak, bu çoklu vb değişkenler, boşluklar göz at ile zor alabilirsiniz benim diğer cevaplar biri Böyle bir durumda bir örnek için.

Daha fazla okuma

Bu mekanizma sayesinde, systemdbirimlerin geçersiz kılınmasının yanı sıra bu değişiklikleri geri almanın (geçersiz kılma dosyasını kaldırarak) çok kolay hale gelir . Bunlar sadece değiştirilebilecek ayarlar değil.

Aşağıdaki linkler faydalı olacaktır:


1
Oneshot türünde olmayan servisler için ayarlamadan önce değişkeni silmeniz gerekir. Bu benim sorunumu çözdü.
Colin,

3
@MarkEdington, manpage'den systemd.service(5)bölüm ExecStart: "Type = oneshot değilse, tam olarak bir komut verilmelidir. Type = oneshot kullanıldığında, sıfır veya daha fazla komut belirtilebilir. yönerge veya alternatif olarak, bu yönerge aynı efektle bir kereden fazla belirtilebilir. Boş dize bu seçeneğe atanırsa, başlatılacak komutların listesi sıfırlanır, bu seçeneğin önceki atamaları etkisiz olur. "
muru,

1
@Orient sudo rm, geçersiz kılma dosyasını ve ardından systemctl daemon-reload, geçersiz kılmadaki systemctl edither şeyi yorumlarla değiştirebilir ve değiştirebilirsiniz. Servis dosyalarındaki yorumlar ile başlar #.
muru

3
@Orientsystemctl revert foo
Ayell

1
Üç yöntem için öncelik sırası nedir (geçersiz kılma dosyası, çevre dosyası, ortam değişkeni)? Yani, her üçünde tanımlanan bir değişken için, hangi değer etkili olacaktır?
Nikolaos Kakouros
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.