Perbedaan antara perintah systemctl dan layanan

143

systemdmemberi kita rangkaian systemctlperintah yang sebagian besar digunakan untuk mengaktifkan layanan untuk memulai saat boot. Kami juga dapat memulai, menghentikan, memuat ulang, memulai kembali, dan memeriksa status layanan dengan bantuan systemctl.

Kita dapat melakukan, misalnya sudo systemctl enable service_name,, dan service_namesecara otomatis akan mulai pada saat boot. Kami juga dapat menonaktifkan layanan untuk tidak memulai saat boot.

Apakah satu-satunya perbedaan antara perintah servicedan systemctlyang systemctldapat digunakan untuk memungkinkan dimulainya layanan saat run time? Bisakah kita menggunakan systemctllayanan apa saja? Apa perbedaan signifikan lainnya yang ada?

luv.preet
sumber
Saya pikir Anda memilih jawaban yang salah, sendiri.
Evan Carroll

Jawaban:

144

The serviceperintah adalah script wrapper yang memungkinkan administrator sistem untuk memulai, menghentikan, dan memeriksa status layanan tanpa khawatir terlalu banyak tentang sistem init aktual yang digunakan. Sebelum pengenalan systemd, itu adalah wrapper untuk /etc/init.dskrip dan initctlperintah Upstart , dan sekarang itu adalah wrapper untuk keduanya dan systemctl juga.

Gunakan sumbernya, Luke!

Ini memeriksa untuk pemula:

# 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

Jika itu tidak berhasil, ia akan mencari systemd:

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

Dan jika itu gagal juga, jatuh kembali ke /etc/init.dskrip System V :

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

Karena serviceperintah ini adalah pembungkus yang cukup sederhana, itu hanya mendukung sebagian kecil tindakan dibandingkan dengan apa yang mungkin disediakan oleh sistem init.

Untuk portabilitas atas berbagai versi Ubuntu, pengguna dapat menggunakan serviceperintah untuk memulai, menghentikan, memulai kembali, atau memeriksa status layanan dengan andal . Untuk lebih tugas yang kompleks, bagaimanapun, perintah aktual yang digunakan, bahwa initctlatau systemctlatau /etc/init.dskrip mungkin harus digunakan secara langsung.

Lebih lanjut, sebagai pembungkus, serviceskrip dalam beberapa kasus juga melakukan lebih dari yang dapat dilakukan oleh perintah setara langsung. Sebagai contoh:

  • Itu selalu mengeksekusi /etc/init.dskrip di lingkungan yang bersih. (Perhatikan doa perintah panjang env dalam run_via_sysvinitfungsi di atas.)
  • Ini memetakan restartpada sistem pemula untuk kombinasi stop/ start, karena dataran initctl restartakan kesalahan jika layanan belum berjalan.
  • Ini menghentikan soket ketika menghentikan layanan systemd yang memiliki soket terkait:

    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.

Layanan pemula diaktifkan secara langsung dalam file konfigurasi layanan (atau dinonaktifkan melalui penggantian), dan skrip System V diaktifkan atau dinonaktifkan dengan update-rc.dperintah (yang mengelola symlink di /etc/rc*direktori), sehingga serviceperintah tidak pernah terlibat dalam mengaktifkan atau menonaktifkan layanan pada saat boot .

muru
sumber
34
  • systemd kompatibel dengan SysV.
  • memuat layanan paralel saat startup
  • itu menyediakan aktivasi layanan berdasarkan permintaan
  • berbasis ketergantungan
  • dan banyak lagi saya kira ...

Ada jauh lebih banyak dari apa yang Anda sebutkan yang systemctlmampu melakukannya.

systemd bekerja dengan unit, ada berbagai jenis unit: target, layanan, soket, dll. Target adalah konsep yang sama dengan runlevel, mereka adalah sekelompok unit bersama-sama.

Anda dapat menggunakan systemctluntuk mengatur atau mendapatkan target sistem default.

systemctl get-default

Anda dapat masuk ke target lain:

systemctl isolate multiuser.target

Target lainnya adalah: multiuser, grafis, recue, darurat, reboot, poweroff.

Seperti yang Anda katakan, Anda dapat menggunakan systemctluntuk mengelola layanan, beberapa perintah lain yang terkait dengan manajemen layanan yang saya ketahui adalah:

# 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

Anda dapat menggunakannya untuk mencari tahu tentang status layanan:

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

Anda dapat menutupi atau membuka kedok layanan:

systemctl mask name.service
systemctl unmask name.service

Jika Anda menutup layanan yang akan ditautkan /dev/null, maka secara manual atau otomatis layanan lain tidak dapat aktif / mengaktifkannya. (Anda harus membuka kedok terlebih dahulu).

Penggunaan lain dari systemctl adalah untuk membuat daftar unit:

systemctl list-units

Yang mencantumkan semua jenis unit, dimuat dan aktif.

Daftar unit layanan:

systemctl list-units --type=service

Atau untuk membuat daftar semua unit yang tersedia tidak hanya yang dimuat dan diaktifkan:

systemctl list-unit-files

Anda dapat membuat alias atau bahkan mengendalikan mesin jarak jauh

systemctl --host [email protected] list-units

Di sisi lain servicemelakukan apa yang harus dilakukan, mengelola layanan dan tidak ada hubungannya dengan bisnis orang lain;)

Ravexina
sumber
1
itu jawaban yang sempurna, Apakah ada yang servicebisa dilakukan tetapi tidak systemctl?
luv.preet
Tidak ada yang saya sadari, saya pikir dengan melihat halaman layanan akan sangat membantu.
Ravexina
1
Ada beberapa perbedaan yang jelas. Sintaksnya satu. Lain adalah bahwa skrip systemv tidak pernah berurusan dengan soket, sejauh yang saya tahu. Fakta bahwa systemd mencoba menangani jenis jaringan adalah hal lain, dan ini sering menjadi titik kritik. Secara keseluruhan, systemd mencoba melakukan lebih dari sekedar memulai layanan
Sergiy Kolodyazhnyy
Saya ingin mengajukan keluhan di sini tentang systemd menyembunyikan pesan log dari service startupaya yang gagal . Pra-systemd, service startakan membiarkan saya melihat mengapa layanan saya tidak akan mulai. Post-systemd, saya harus melihat empat atau lima log yang berbeda sebelum dapat menemukannya. Semua yang mengatakan, komentar saya tidak diragukan lagi topik dan mungkin akan dihapus.
Ross Presser
11
AFAICS Jawaban ini sepertinya tidak memberi tahu apa-apa tentang serviceperintah, bukankah itu bagian dari pertanyaan?
ilkkachu