Systemctl init.d ve servis arasındaki fark


39

Linux için yeniyim ve kendimi bir Amazon Lightsail örneği (Ubuntu 16.04 LTS) kullanarak test ediyorum.

Karşılaştığım birçok rehberde, bir servisi başlatmak / durdurmak / yeniden başlatmak / yeniden yüklemek / durum kontrolü yapmak için farklı komutlar kullanan kişiler görüyorum. Özellikle bunlar;

sudo systemctl status apache2.service
sudo /bin/systemctl status apache2.service
sudo /etc/init.d/apache2 status
sudo service apache2 status

Yukarıdaki tüm komutlar çalışır.

  1. Bir komutu diğerine tercih etmeli miyim?
  2. Eğer öyleyse neden?
  3. Bilmem gereken başka komutlar var mı?

Monit'te init.d kullanmak, durum seçeneğini kullanmak istediğimde sorunlara neden oldu (durum aslında çevrimiçi olduğunda servis çevrimdışıydı - Monit tarafından yeniden başlatılıyor). Monit'teki kodu inid.d'den / bin / systemctl 'e düzelt.

İnit.d kullanmanın diğerlerinin başına gelenler hakkında daha fazla bilgi sağladığı görülüyor. Diğer komutlardan birini kullanmam gerekirse, ne yapıldığı hakkında daha fazla bilgi göstermeleri mümkün mü?

ubuntu@ip-172-26-12-245:~$ sudo systemctl restart pure-ftpd.service
ubuntu@ip-172-26-12-245:~$ sudo /bin/systemctl restart pure-ftpd.service
ubuntu@ip-172-26-12-245:~$ sudo /etc/init.d/pure-ftpd restart
[ ok ] Restarting pure-ftpd (via systemctl): pure-ftpd.service.
ubuntu@ip-172-26-12-245:~$ sudo service pure-ftpd restart
ubuntu@ip-172-26-12-245:~$

Bu soruyu okumak ve cevaplamak için zaman ayırmış olan herkese şimdiden teşekkür etmek istiyorum.


Linux'ta genellikle bir eylem gerçekleştirmenin bir yolu vardır. Daha iyi ya da daha kötü ya da doğru ya da yanlış olan yoktur. Şahsen ben en az yazarak birini kullanın. Bu komutların birçoğu, Ubuntu sistemde değiştikçe sym linkleri veya geri uyumluluk olabilir.
Panter

systemctltercih edilen sözdizimidir ve servicegeriye dönük uyumluluk sağlanır. /etc/init.d/pure-ftpdveya benzeri, start / stop komut dosyalarını doğrudan çağırıyor.
Panter

Yanıtlar:


57

Başlangıç olarak bir bütün tarihi ve gidiş arasındaki mücadele var SysVInitetmek SystemD. Yine de hepsini tek bir cevapta yıkmaya çalışmak yerine, tarihle ilgili daha fazla ayrıntı ve konuyla ilgili belirli bir makale için sizi biraz google girişimine yönlendireceğim:

http://www.tecmint.com/systemd-replaces-init-in-linux/

Özetle, yavaş ve zorlu bir geçiş oldu. Bazı eski özellikler bozulmadan tutulmuştur ( init.dbir dereceye kadar). systemctlServis kontrolünüz için kullanma seçeneğiniz varsa, bunu kullanmanızı öneririm. Linux için öngörülebilir bir gelecek ve sonuçta eski SysVInityöntemler tamamen kullanımdan kaldırılacak ve kaldırılacak.

Özel olarak listelediğiniz her birini kapsayacak şekilde:

  1. sudo systemctl status apache2.service

SystemDServis hizmetlerine yeni yaklaşım budur. İleriye doğru, Linux'taki uygulamalar, diğerlerini değil, systemd yöntemini kullanmak için tasarlanmıştır.

  1. sudo /bin/systemctl status apache2.service

Bu önceki komut ile aynı şey. Bu durumda tek fark $PATH, komutun bulunacağı kabuğun ortam değişkenine bağlı olmaması , komutun yolunu ekleyerek komutun açıkça listelenmesidir.

  1. sudo /etc/init.d/apache2 status

Bu, SysVInitbir servisi aramanın orijinal yöntemidir. Init betikleri bir servis için yazılır ve bu dizine yerleştirilir. Bu yöntem hala pek çok kişi tarafından kullanılsa da, serviceiçinde servis çağırma yönteminin yerini alan komut buydu SysVInit. Bunun için daha yeni sistemlerde bazı eski işlevler vardır SystemD, ancak çoğu yeni program bunu içermez ve tüm eski uygulama init betikleri onunla çalışmaz.

  1. sudo service apache2 status

Bu, SysVInithizmetler için sistemlerde kullanılan birincil araçtı . Bazı durumlarda sadece /etc/init.d/komut dosyalarına bağlanır , ancak diğer durumlarda başka yerlerde depolanmış bir başlangıç ​​komut dosyasına gider. Hizmet bağımlılığı işlemeye daha yumuşak bir geçiş sağlanması amaçlanmıştır.


Son olarak, bazıları diğerlerinden daha fazla bilgi verdiğinden, komutlardan nasıl daha fazla bilgi alacağınızı bilmek istediğinizi söylersiniz. Bu hemen hemen her zaman uygulama ve init veya hizmet dosyalarını nasıl tasarladıkları ile belirlenir. Genel bir kural olarak, eğer sessizce tamamlanırsa başarılı olmuştur. Ancak, bir doğrulamak için start, stopveya nasıl yapıldığını görmek restartiçin statusalt komutu kullanabilirsiniz. statusEski bir init betiğinde yanlış olan bir komuttan bahsettiniz . Bu, uygulama geliştiricilerin bakması gereken bir hatadır. Bununla birlikte, init betikleri hizmetlerin kullanımdan kaldırılmış yöntemi haline geldiğinden, init betiği seçeneğini tamamen kaldırana kadar hatayı görmezden gelebilirler. systemctl status Her zaman doğru çalışmalı, aksi takdirde uygulama geliştiricileri ile bir hata kaydedilmelidir.


Detaylı cevabınız için çok teşekkür ederim. Ben de cevaplar için Googling'im ama bu beni gerçekten şaşırttı, bu yüzden buraya gönderdim. Ayrıca sudo systemctl status apache2'nin yerine çalıştığını görüyorum (sudo systemctl status apache2.service). Servis kısmının yukarısında bir zarar var mı?
Waqas Tarık

@ WaqasTariq sorun değil! İkisinin de çalışması gerekir systemctl, servis dosyalarının saklandığı dizinleri arar ve bulursa sizin için ".service" ekler. Mesela, sekmeyi yalnızca yazdıktan sonra bir kez vurursanız, sizin için sudo systemctl status apache2ekleyerek tamamlaması gerekir .service. Birden fazla apache2 systemctl dosyası varsa (örneğin .serviceve .targetsiz, sekmeye iki kez basmanız gerekir, böylece mevcut tüm seçenekleri gösterir.)
TopHat

Anladım. Cevaplarınız ve zaman ayırdığınız için teşekkür ederiz.
Waqas Tarık

@WaqasTariq hoş geldiniz!
TopHat
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.