Sự khác biệt giữa các lệnh systemctl và dịch vụ


143

systemdcung cấp cho chúng tôi bộ systemctllệnh được sử dụng chủ yếu để cho phép các dịch vụ bắt đầu khi khởi động. Chúng tôi cũng có thể bắt đầu, dừng, tải lại, khởi động lại và kiểm tra trạng thái dịch vụ với sự trợ giúp của systemctl.

Chúng tôi có thể làm, ví dụ sudo systemctl enable service_name, và service_namesẽ tự động bắt đầu khi khởi động. Chúng tôi cũng có thể vô hiệu hóa các dịch vụ không bắt đầu khi khởi động.

Là sự khác biệt duy nhất giữa servicesystemctlcác lệnh systemctlcó thể được sử dụng để cho phép bắt đầu dịch vụ khi chạy? Chúng tôi có thể sử dụng systemctltrên bất kỳ dịch vụ? Có sự khác biệt đáng kể nào khác không?


Tôi nghĩ rằng bạn đã chọn câu trả lời sai, bản thân mình.
Evan Carroll

Câu trả lời:


144

Các servicelệnh là một kịch bản wrapper cho phép các quản trị viên hệ thống để bắt đầu, dừng, và kiểm tra tình trạng dịch vụ mà không cần lo lắng quá nhiều về hệ thống init thực tế đang được sử dụng. Trước khi giới thiệu systemd, nó là một trình bao bọc cho /etc/init.dcác tập lệnh và lệnh Upstart initctl, và bây giờ nó là một trình bao bọc cho cả hai systemctl cả.

Sử dụng nguồn, Luke!

Nó kiểm tra Upstart:

# 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

Nếu nó không hoạt động, nó sẽ tìm 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

Và nếu điều đó cũng thất bại, nó sẽ quay trở lại /etc/init.dcác kịch bản 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

servicelệnh là một trình bao bọc khá đơn giản, nó chỉ hỗ trợ một tập hợp hành động giới hạn so với những gì hệ thống init thực tế có thể cung cấp.

Đối với tính di động trên các phiên bản khác nhau của Ubuntu, người dùng có thể sử dụng servicelệnh một cách đáng tin cậy để bắt đầu, dừng, khởi động lại hoặc kiểm tra trạng thái của dịch vụ. Tuy nhiên, đối với các tác vụ phức tạp hơn, lệnh thực tế đang được sử dụng, có thể initctlhoặc systemctlhoặc /etc/init.dtập lệnh có thể phải được sử dụng trực tiếp.

Hơn nữa, là một trình bao bọc, servicetập lệnh trong một số trường hợp cũng thực hiện nhiều hơn lệnh tương đương trực tiếp có thể làm. Ví dụ:

  • Nó luôn luôn thực thi /etc/init.dcác tập lệnh trong một môi trường sạch sẽ. (Lưu ý cách gọi lệnh dài env trong run_via_sysvinithàm trên.)
  • Nó ánh xạ restarttrên các hệ thống Upstart thành một tổ hợp stop/ start, vì một đơn vị initctl restartsẽ lỗi nếu dịch vụ chưa chạy.
  • Nó dừng các socket khi dừng các dịch vụ systemd có các socket liên quan:

    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.

Các dịch vụ mới bắt đầu được kích hoạt trực tiếp trong tệp cấu hình dịch vụ (hoặc bị vô hiệu hóa qua phần ghi đè) và tập lệnh System V được bật hoặc tắt bằng update-rc.dlệnh (quản lý symlink trong /etc/rc*thư mục), vì vậy servicelệnh không bao giờ liên quan đến việc bật hoặc tắt dịch vụ khi khởi động .


34
  • systemd tương thích ngược với SysV.
  • tải dịch vụ song song khi khởi động
  • nó cung cấp kích hoạt theo yêu cầu của một dịch vụ
  • nó phụ thuộc
  • và nhiều hơn nữa tôi đoán ...

Có rất nhiều hơn những gì bạn đề cập systemctlcó khả năng.

systemd làm việc với các đơn vị, có các loại đơn vị khác nhau: mục tiêu, dịch vụ, ổ cắm, v.v ... các mục tiêu có cùng khái niệm với runlevels, chúng là một nhóm các đơn vị với nhau.

Bạn có thể sử dụng systemctlđể đặt hoặc lấy mục tiêu hệ thống mặc định.

systemctl get-default

Bạn có thể đi vào các mục tiêu khác:

systemctl isolate multiuser.target

Các mục tiêu khác là: nhiều người dùng, đồ họa, recue, khẩn cấp, khởi động lại, poweroff.

Như bạn đã nói, bạn có thể sử dụng systemctlđể quản lý dịch vụ, một số lệnh khác liên quan đến quản lý dịch vụ mà tôi biết là:

# 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

Bạn có thể sử dụng nó để tìm hiểu về tình trạng dịch vụ:

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

Bạn có thể che dấu hoặc vạch mặt một dịch vụ:

systemctl mask name.service
systemctl unmask name.service

Bạn có thể che giấu một dịch vụ mà nó sẽ được liên kết /dev/null, do đó, các dịch vụ khác tự động hoặc không thể kích hoạt. (bạn nên vạch mặt nó trước).

Một cách sử dụng khác của systemctl là liệt kê các đơn vị:

systemctl list-units

Mà liệt kê tất cả các loại đơn vị, tải và hoạt động.

Liệt kê các đơn vị dịch vụ:

systemctl list-units --type=service

Hoặc để liệt kê tất cả các đơn vị có sẵn không chỉ các đơn vị được tải và kích hoạt:

systemctl list-unit-files

Bạn có thể tạo bí danh hoặc thậm chí điều khiển máy từ xa

systemctl --host ravexina@192.168.56.4 list-units

Mặt khác servicelàm những gì nó phải làm, quản lý dịch vụ và không liên quan gì đến việc kinh doanh của người khác;)


1
Đó là một câu trả lời hoàn hảo, Có điều gì servicecó thể làm nhưng không systemctl?
luv.preet

Không có gì tôi biết về điều đó, tôi nghĩ rằng việc xem trang người phục vụ sẽ hữu ích.
Ravexina

1
Có một vài sự khác biệt rõ ràng. Cú pháp là một. Một điều nữa là các script systemv không bao giờ xử lý các socket, theo như tôi biết. Thực tế là systemd đang cố gắng đối phó với các loại công cụ mạng là một vấn đề khác và đó là một điểm thường xuyên của phê bình. Trên tất cả, systemd đang cố gắng làm nhiều hơn là chỉ bắt đầu các dịch vụ
Sergiy Kolodyazhnyy

Tôi muốn khiếu nại ở đây về việc systemd ẩn các thông điệp tường trình khỏi các service startlần thử thất bại . Pre-systemd, service startsẽ cho tôi biết ngay tại sao dịch vụ của tôi sẽ không bắt đầu. Sau khi hệ thống, tôi phải xem bốn hoặc năm bản ghi khác nhau trước khi tôi có thể tìm thấy nó. Tất cả những gì đã nói, bình luận của tôi chắc chắn lạc đề và có lẽ sẽ bị xóa.
Ross Presser

11
AFAICS Câu trả lời này dường như không nói gì về servicelệnh, đó không phải là một phần của câu hỏi?
ilkkachu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.