Sistemdeki bir servisi açılışta son servis olarak nasıl kullanıyorsunuz?


26

Yıllar önce, başlangıç ​​betiğimizi içine yazabiliriz /etc/rc.local. Tüm sistem servisleri yüklendikten sonra betiğiniz çalışacaktır.

Şimdi, biz systemd kullanıyoruz, rc.localartık yok. Systemd servis paralelini başlatır. Bir rc.local` yapmak için kendi servisinizi yazabilirsiniz ancak tüm sistem servisleri yüklendikten sonra çalışacağından emin olamazsınız.

Bunu yapmanın bir yolu var mı? Ya da kullanımına sahip Beforeve Aftersystemd hizmet dosyasında?



5
Systemd, başlangıç ​​değil!
盖子 盖子

Ad ve sürüm işletim sistemi belirtilsin mi?
STTR

İşletim Sistemi: Arch Linux, Sürüm: N / A
比尔 盖子

1
@ Neden, "son", senaryonun bağımlılıklarını bilmiyor musun, yoksa sadece güvende olmasını mı istiyorsun?
Paul

Yanıtlar:


27

Sistemde hizmetlerinizi diğerlerine güzel bir şekilde kullanmanız Before=ve After=sipariş etmeniz önerilir .

Ancak Beforeve kullanmadan bir yol istediğinden beri After, kullanabilirsiniz:

Type=idle

açıklandığı gibi man systemd.service:

Davranışına idleçok benzer simple; ancak, tüm aktif işler gönderilinceye kadar servis programının fiili olarak yürütülmesi ertelenir. Bu, kabuk hizmetlerinin çıktısının konsoldaki durum çıktısı ile birleştirilmesini önlemek için kullanılabilir. Bu türün yalnızca konsol çıktısını iyileştirmek için yararlı olduğunu, genel bir birim sipariş aracı olarak kullanışlı olmadığını ve bu hizmet türünün etkisinin 5s'lik bir zaman aşımına maruz kaldığını ve bunun ardından servis programının başlatıldığını unutmayın.


1
Merhaba, önce veya sonra kullanacak olsaydım, sözdizimini daha ayrıntılı olarak anlatır mısın?
r4ccoon

Biraz farklı bir konu, ancak birisi kullanıcı işlemlerini sistem işlemlerinden ayrı çalıştırmak isterse, askubuntu.com/a/859583/457417
Ben Creasy

boot sürecinin sonunda ayarlamak /proc/sys/kernel/modules_disablediçin mükemmel çalıştı1
Stuart Cardall

0

Bu gerçekten "booted" tanımınıza bağlıdır. Savaş başladıktan hemen sonra çalışmasını istediğinizi varsayıyorum. Bunu yapmak için servisinizi /etc/systemd/system/getty.target.wants/dizine eklemeniz gerekir . Dosyanızın, bu dizindeki diğer servislere benzer bir kod kullandığından da emin olmalısınız. Açılışta ve kapanışta özel bir hizmet çalıştırmak için (sadece anakartımın sesli uyarıcısı geliyor) Aşağıdaki komut dosyasını kullanıyorum/etc/systemd/system/getty.target.wants/service_name.service

[Unit]
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service
Before=getty.target
IgnoreOnIsolate=yes

[Service]
ExecStart=/usr/bin/myinitscript.sh start
ExecStop=/usr/bin/myinitscript.sh stop
Type=oneshot
RemainAfterExit=true

[Install]
WantedBy=basic.target

/usr/bin/myinitscript.sh çalıştırılabilir ve başında bir shebang vardır.

Her şeyin önyüklemedeki bu noktada başlatılmayacağını, ancak oturum açma isteminin kullanıcıya göründüğü nokta budur.

Her ne kadar bu kullanıyorsa Before=ve After=benim için çok daha anlaşılır ve işe yarıyordu; Yukarıdaki cevabı yeterince bilgilendirici bulamadım. Bu da her iki kullanmanıza olanak verir ExecStart=ve ExecStop=yerine bir ile sınırlı olması, Type=simplebenzeri hizmet.


-2

Özelliklere ya da ArchLinux'a aşina değilim, ancak genel olarak sistem yönetimi nasıl yapılır.

Temel olarak systemd, /etc/init.d/ içinde /etc/rcX.d'den gelen sembolik işaretlerle gösterilen ve X'in çalışma seviyesinin sayısı olan komut dizileridir. Symlinks kendilerini aşağıdaki biçimdedir:

[K | S] + nn + [string]

nerede:

  • nn , bu komut dosyalarının çalıştırılma sırasını belirleyen bir sayıdır
  • string , /etc/init.d/ içinde göründüğü şekliyle betiğin adıdır.
  • ve son olarak K veya S, betiğin çağrıldığı komutu belirler: sırasıyla stop veya start.

Bu nedenle, komut dosyanızın önyükleme sırasında en sonda çalışmasını istiyorsanız, aşağıdakileri yapmanız gerekir:

  1. komut dosyanızı /etc/init.d/ içine koyun ve yürütülebilir duruma getirin
  2. betiğin başlaması gereken hedef çalışma seviyesini belirleyin (konsol için tipik olarak 2 ve grafiksel kullanıcı arayüzü için 5). Gibi bir şey ile tespit edilebilirrunlevel
  3. Bu çalışma seviyesinde hangi komut dosyalarının zaten bulunduğuna bir göz atın ls /etc/rc<target runlevel>.d/ve orada bulunan diğerlerinden daha büyük olan iki basamaklı bir sayı seçin.
  4. update-rc.dDebian tabanlı veya chkconfigFedora benzeri veya manuel gibi dağıtımınıza özgü bir yardımcı program kullanarak , init betiğinize /etc/rc.d/S yazın.

5
Tanımladığın aslında sysVinit. Sistemin sysVinit'in çalışma şekliyle uyumlu olduğu doğru olsa da, bir anahtar fark var - her şey paralel olarak gerçekleştiriliyor. Ayrıca iki tür servis vardır, sysVinit servisleri ve systemd servisleri. Cevabınız, sysVinit servislerinden sonra bir şeyin yürütülmesine yardımcı olabilir, ancak mutlaka sistemdekileri değil.
Sam,

1
Systemd, ilk günden itibaren sysvinit ile uyumlu olmayı hedeflememektedir.
14'te
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.