Systemctl ve servis komutları arasındaki fark


143

systemdbize systemctlhizmetlerin açılışta başlamasını sağlamak için çoğunlukla kullanılan komutlar grubunu verir . Ayrıca hizmetlerin durumunu başlatabilir, durdurabilir, yeniden yükleyebilir, yeniden başlatabilir ve kontrol edebiliriz systemctl.

Örneğin yapabiliriz sudo systemctl enable service_nameve service_nameaçılışta otomatik olarak başlayacağız. Önyükleme sırasında başlamayan hizmetleri de devre dışı bırakabiliriz.

Hizmetlerin çalışma zamanında başlatılmasını sağlamak için kullanılabilecek serviceve systemctlkomutları arasındaki tek fark var mı systemctl? systemctlHerhangi bir hizmeti kullanabilir miyiz ? Başka hangi önemli farklılıklar var?


Sanırım yanlış cevabı sen seçtin.
Evan Carroll

Yanıtlar:


144

serviceKomut sistem yöneticileri, başlatmak, durdurmak ve gerçek init sistemi kullanıldığı konusunda çok fazla önemsemeden hizmetlerinin durumunu kontrol etmenizi sağlayan bir sarıcı betik. Systemd en getirilmesinden önce, onun için bir sarıcı oldu /etc/init.dkomut ve sonradan görme adlı initctlkomuta ve şimdi bu ikisi için bir sarıcı ve systemctl de.

Kaynağı kullan, Luke!

Upstart'ı kontrol eder:

# Operate against system upstart, not session
unset UPSTART_SESSION
if [ -r "/etc/init/${SERVICE}.conf" ] && which initctl >/dev/null \
   && initctl version 2>/dev/null | grep -q upstart \
   && initctl status ${SERVICE} 2>/dev/null 1>/dev/null
then
   # Upstart configuration exists for this job and we're running on upstart

Bu işe yaramazsa, systemd arar:

if [ -d /run/systemd/system ]; then
   is_systemd=1
fi

...

# When this machine is running systemd, standard service calls are turned into
# systemctl calls.
if [ -n "$is_systemd" ]
then

Bu da başarısız olursa, System V /etc/init.dbetiklerine geri döner :

run_via_sysvinit() {
   # Otherwise, use the traditional sysvinit
   if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
      exec env -i LANG="$LANG" LANGUAGE="$LANGUAGE" LC_CTYPE="$LC_CTYPE" LC_NUMERIC="$LC_NUMERIC" LC_TIME="$LC_TIME" LC_COLLATE="$LC_COLLATE" LC_MONETARY="$LC_MONETARY" LC_MESSAGES="$LC_MESSAGES" LC_PAPER="$LC_PAPER" LC_NAME="$LC_NAME" LC_ADDRESS="$LC_ADDRESS" LC_TELEPHONE="$LC_TELEPHONE" LC_MEASUREMENT="$LC_MEASUREMENT" LC_IDENTIFICATION="$LC_IDENTIFICATION" LC_ALL="$LC_ALL" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" ${ACTION} ${OPTIONS}
   else
      echo "${SERVICE}: unrecognized service" >&2
      exit 1
   fi
}

...
run_via_sysvinit

Yana servicekomut oldukça basit bir sarıcı, sadece fiili init sistemi yapabileceğinden kıyasla eylemlerin sınırlı bir kümesini destekler.

Ubuntu'nun çeşitli sürümlerinde taşınabilirlik için, kullanıcılar servicebir hizmetin durumunu başlatmak, durdurmak, yeniden başlatmak veya incelemek için komutu güvenle kullanabilirler . Daha karmaşık görevler için, ancak, fiili komut kullanılıyor, yani olması initctlveya systemctlveya /etc/init.dkomut doğrudan kullanılacak gerekebilir.

Ayrıca, bir sarmalayıcı olarak, servicebazı durumlarda komut dosyası da doğrudan eşdeğer komutun yapabileceğinden fazlasını yapar. Örneğin:

  • /etc/init.dKomut dosyalarını her zaman temiz bir ortamda çalıştırır . ( Yukarıdaki işlevdeki uzun env komut çağrısına dikkat edin run_via_sysvinit.)
  • restartUpstart sistemlerinde stop/ kombinasyonunu eşler start, çünkü initctl restarteğer servis zaten çalışmıyorsa, ova bir hata yapar.
  • İlgili soketlere sahip sistem ve servisleri durdururken soketleri durdurur:

    case "${ACTION}" in
      restart|status)
         exec systemctl $sctl_args ${ACTION} ${UNIT}
      ;;
      start|stop)
         # Follow the principle of least surprise for SysV people:
         # When running "service foo stop" and foo happens to be a service that
         # has one or more .socket files, we also stop the .socket units.
         # Users who need more control will use systemctl directly.

Başlatma hizmetleri doğrudan servis yapılandırma dosyasında (ya da geçersiz kılmalar yoluyla devre dışı bırakıldı) etkinleştirildi ve Sistem V komut dosyaları update-rc.dkomutla etkinleştirildi ya da devre dışı bırakıldı ( /etc/rc*dizinlerde sembolik bağlantıları yönetti ), bu nedenle servicekomut önyükleme sırasında hizmetlerin etkinleştirilmesi ya da devre dışı bırakılmasında yer almadı. .


34
  • systemd SysV ile geriye doğru uyumludur.
  • hizmetleri başlangıçta paralel yüklüyor
  • bir servisin isteğe bağlı aktivasyonunu sağlar
  • bağımlılık temelli
  • ve çok daha fazlası sanırım ...

Bahsettiğinden çok daha fazlası var systemctl.

systemd Birimlerle çalışırsa, farklı türlerde birimler vardır: hedefler, hizmetler, soketler vb. hedefler çalışma seviyeleriyle aynı kavramdır, bir arada birimlerdir.

systemctlVarsayılan sistem hedefini belirlemek veya almak için kullanabilirsiniz .

systemctl get-default

Diğer hedeflere gidebilirsiniz:

systemctl isolate multiuser.target

Diğer hedefler: çok kullanıcılı, grafiksel, özyinelemeli, acil durum, yeniden başlatma, kapanma.

Dediğiniz gibi, systemctlhizmetleri yönetmek için kullanabilirsiniz , hizmet yönetimi ile ilgili diğer komutlardan bazılarının farkındayım:

# Restarts a service only if it is running.
systemctl try-restart name.service

# Reloads configuration if it's possible.
systemctl reload name.service

# try to reload but if it's not possible restarts the service
systemctl reload-or-restart name.service

Bir servis durumu hakkında bilgi edinmek için kullanabilirsiniz:

systemctl status name.service

systemctl is-active name.service # running
systemctl is-enabled name.service # will be activated when booting
systemctl is-failed name.service # failed to load

Bir hizmeti maskeleyebilir veya maskesini kaldırabilirsiniz:

systemctl mask name.service
systemctl unmask name.service

Bağlanacağınız bir servisi maskelemeniz durumunda /dev/null, manuel veya otomatik olarak diğer servisler etkinleştiremez / etkinleştiremez. (önce maskesini çıkarmalısın).

Systemctl'nin bir diğer kullanımı birimleri listelemektir:

systemctl list-units

Yüklenen ve aktif olan tüm birimleri listeler.

Servis birimlerini listele:

systemctl list-units --type=service

Veya yalnızca yüklü ve etkin olmayan tüm kullanılabilir birimleri listelemek için:

systemctl list-unit-files

Takma adlar oluşturabilir veya uzaktaki makineleri bile kontrol edebilirsiniz

systemctl --host ravexina@192.168.56.4 list-units

Öte yandan service, yapması gerekeni yapar, hizmetleri yönetir ve diğer insanların işi ile ilgisi yoktur;)


1
Bu mükemmel bir cevaptı, serviceyapabilecek bir şey var mı yok systemctlmu?
luv.preet

Farkında olduğum bir şey yok, servis sayfası sayfasına bir göz atmanın faydalı olacağını düşünüyorum.
Ravexina

1
Birkaç belirgin fark var. Sözdizimi bir. Bir diğeri ise, sistemv betiklerinin bildiğim kadarıyla hiçbir zaman soketlerle ilgilenmemesidir. Sistemin ağ türleriyle uğraşmaya çalıştığı gerçeği bir başka şeydir ve bu sık sık bir eleştiri noktasıdır. Genel olarak, systemd sadece hizmet vermeye başlamaktan daha fazlasını yapmaya çalışıyor
Sergiy Kolodyazhnyy

Burada, başarısız service startgirişimlerden log mesajlarının gizlenmesiyle ilgili sistemd şikayet yapmak istiyorum . Sistem öncesi, service starthizmetimin neden başlamadığını hemen görmeme izin verirdi. Sistem sonrası, bulmadan önce dört ya da beş farklı kütüğe bakmalıyım. Bütün bunlar, benim yorumum şüphesiz konu dışı ve muhtemelen silinecek.
Ross Presser

11
AFAICS Bu cevap servicekomutla ilgili hiçbir şey söylemiyor gibi görünüyor , sorunun bir parçası değil mi?
ilkkachu
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.