Perbedaan antara systemctl init.d dan layanan

40

Saya baru mengenal linux dan telah menguji diri saya menggunakan contoh Amazon Lightsail (Ubuntu 16.04 LTS).

Melewati banyak panduan yang saya temui, saya melihat orang menggunakan perintah yang berbeda untuk memulai / menghentikan / memulai kembali / memuat kembali / memeriksa status suatu layanan. Khususnya ini;

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

Semua perintah di atas berfungsi.

  1. Haruskah saya lebih suka satu perintah daripada yang lain?
  2. Jika ya lalu mengapa?
  3. Apakah ada perintah lain yang perlu saya waspadai?

Menggunakan init.d di Monit menyebabkan masalah ketika saya ingin menggunakan opsi status (statusnya adalah bahwa layanan offline ketika sebenarnya online - restart oleh Monit). Ubah kode dalam Monit dari inid.d menjadi / bin / systemctl memperbaikinya.

Tampaknya menggunakan init.d memberikan lebih banyak informasi tentang apa yang terjadi pada yang lain. Jika saya harus menggunakan salah satu dari perintah lain, mungkinkah mereka menampilkan lebih banyak informasi tentang apa yang dilakukan?

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:~$

Saya ingin mengucapkan terima kasih kepada semua orang di muka yang telah meluangkan waktu untuk membaca dan membalas pertanyaan ini.

Tariq Waqas
sumber
Di Linux sering ada lebih dari satu cara untuk melakukan suatu tindakan. Tidak ada yang lebih baik atau lebih buruk atau benar atau salah. Secara pribadi saya menggunakan yang paling sedikit mengetik. Banyak dari perintah ini mungkin sym link atau back kompatibilitas ketika Ubuntu berubah ke systemd.
Panther
systemctladalah sintaks yang disukai dan servicedisediakan sebagai kompatibilitas ke belakang. /etc/init.d/pure-ftpdatau sejenisnya memanggil skrip start / stop secara langsung.
Panther

Jawaban:

57

Untuk memulainya, ada seluruh sejarah dan perjuangan antara beralih dari SysVInitmenjadi SystemD. Alih-alih mencoba menjabarkan semuanya dalam satu jawaban, saya akan merujuk Anda ke beberapa penjelajah google untuk detail lebih lanjut tentang sejarah serta satu artikel tertentu pada topik:

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

Singkatnya, ini merupakan transisi yang lambat dan sulit. Beberapa fitur lawas tetap utuh (seperti init.dbeberapa derajat). Jika Anda memiliki opsi untuk digunakan systemctluntuk kontrol layanan Anda, saya sarankan menggunakan yang itu. Ini adalah masa depan yang dapat diperkirakan untuk Linux dan pada akhirnya SysVInitmetode yang lebih tua akan dianggap usang seluruhnya dan dihapus.

Untuk mencakup setiap yang Anda daftarkan secara khusus:

  1. sudo systemctl status apache2.service

Ini adalah SystemDpendekatan baru untuk menangani layanan. Ke depan, aplikasi di Linux dirancang untuk menggunakan metode systemd, bukan yang lain.

  1. sudo /bin/systemctl status apache2.service

Ini adalah hal yang sama dengan perintah sebelumnya. Satu-satunya perbedaan dalam hal ini adalah bahwa itu tidak tergantung pada $PATHvariabel lingkungan shell untuk menemukan perintah, itu daftar perintah secara eksplisit dengan memasukkan path ke perintah.

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

Ini adalah SysVInitmetode asli untuk memanggil layanan. Skrip init akan ditulis untuk layanan dan ditempatkan di direktori ini. Sementara metode ini masih digunakan oleh banyak orang, serviceadalah perintah yang menggantikan metode memanggil layanan di SysVInit. Ada beberapa fungsi peninggalan untuk ini pada sistem yang lebih baru SystemD, tetapi sebagian besar program yang lebih baru tidak memasukkan ini, dan tidak semua skrip init aplikasi yang lebih lama bekerja dengannya.

  1. sudo service apache2 status

Ini adalah alat utama yang digunakan pada SysVInitsistem untuk layanan. Dalam beberapa kasus itu hanya terhubung ke /etc/init.d/skrip, tetapi dalam kasus lain itu pergi ke skrip init yang disimpan di tempat lain. Itu dimaksudkan untuk memberikan transisi yang lebih lancar ke penanganan ketergantungan layanan.


Terakhir, Anda menyebutkan ingin tahu cara mendapatkan lebih banyak informasi dari perintah, karena beberapa memberikan lebih banyak informasi daripada yang lain. Ini hampir selalu ditentukan oleh aplikasi dan bagaimana mereka mendesain file init atau layanan mereka. Sebagai aturan umum, jika diselesaikan dengan diam-diam itu berhasil. Namun, untuk memverifikasi start, stopatau restart, Anda dapat menggunakan statussub-perintah untuk melihat bagaimana hal itu dilakukan. Anda menyebutkan statusperintah yang salah pada skrip init lama. Itu adalah bug yang harus dilihat oleh pengembang aplikasi. Namun, karena skrip init menjadi metode penanganan layanan yang sudah usang, mereka mungkin mengabaikan bug sampai mereka menghapus opsi skrip init sepenuhnya. Itusystemctl status harus selalu berfungsi dengan benar jika tidak bug harus dicatat dengan pengembang aplikasi.

Pucuk topi
sumber
Terima kasih banyak atas balasan terperinci Anda. Saya juga mencari jawaban di Google tetapi yang ini benar-benar membingungkan saya, jadi saya mempostingnya di sini. Saya juga melihat bahwa sudo systemctl status apache2 berfungsi, alih-alih (sudo systemctl status apache2.service). Apakah ada salahnya melepaskan bagian .service?
Waqas Tariq
@ WaqasTariq tidak masalah! Keduanya harus bekerja, systemctlakan mencari direktori di mana file layanan disimpan dan menambahkan ".service" untuk Anda jika menemukannya. Jadi misalnya, jika Anda menekan tab sekali setelah hanya menulis sudo systemctl status apache2itu harus melengkapinya dengan menambahkan .serviceuntuk Anda. Jika ada lebih dari satu file systemctl apache2 (seperti .servicedan .targetAnda harus menekan tab dua kali sehingga menunjukkan semua opsi yang tersedia.
TopHat
Oke. Terima kasih atas jawaban dan waktu Anda.
Waqas Tariq
@WaqasTariq, selamat datang!
TopHat