systemctl과 service 명령의 차이점


143

systemd우리에게주는 systemctl대부분은 부팅시 시작하는 서비스를 활성화하는 데 사용되는 명령 제품군을. 또한의 도움으로 서비스를 시작, 중지, 다시로드, 다시 시작 및 상태를 확인할 수 systemctl있습니다.

우리는, 예를 들어, 할 수있는 sudo systemctl enable service_name, 그리고 service_name부팅시 자동으로 시작됩니다. 부팅시 서비스가 시작되지 않도록 비활성화 할 수도 있습니다.

런타임시 서비스를 시작하는 데 사용할 수있는 servicesystemctl명령 의 유일한 차이점은 systemctl무엇입니까? systemctl어떤 서비스에도 사용할 수 있습니까 ? 다른 중요한 차이점은 무엇입니까?


나는 당신이 틀린 답을 고른 것 같아요.
Evan Carroll

답변:


144

service명령은 시스템 관리자가 사용중인 실제 init 시스템에 대해 너무 걱정하지 않고 서비스 상태를 시작, 중지 및 확인할 수있는 랩퍼 스크립트입니다. systemd의 도입에 앞서 래퍼이었다 /etc/init.d스크립트와 갑자기 출세의 initctl명령, 지금은이 두 가지에 대한 래퍼입니다 systemctl 뿐만 아니라이.

루크!

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

그래도 작동하지 않으면 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

또한 실패하면 System V /etc/init.d스크립트로 넘어갑니다 .

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

service명령은 상당히 간단한 래퍼이므로 실제 init 시스템이 제공 할 수있는 것보다 제한된 하위 집합 만 지원합니다.

다양한 버전의 Ubuntu를 통한 이식성을 위해 사용자는 service명령을 안정적으로 사용하여 서비스의 시작, 중지, 다시 시작 또는 서비스 상태를 검사 할 수 있습니다 . 더 복잡한 작업을 위해, 그러나, 실제 명령이 사용되는, 그 일 initctl이나 systemctl또는 /etc/init.d스크립트를 직접 사용할 수있을 수 있습니다.

또한 랩퍼 인 경우에 따라 service스크립트는 직접 동등한 명령보다 많은 기능을 수행합니다. 예를 들면 다음과 같습니다.

  • 항상 /etc/init.d깨끗한 환경에서 스크립트를 실행 합니다. ( 위 함수 에서 env 명령 호출에 유의하십시오 run_via_sysvinit.)
  • 서비스가 아직 실행되고 있지 않은 경우 일반 오류가 발생 하므로 restartUpstart 시스템에서 stop/ 조합으로 매핑 됩니다 .startinitctl restart
  • 관련 소켓이있는 시스템 서비스를 중지하면 소켓이 중지됩니다.

    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.

Upstart 서비스는 서비스 구성 파일에서 직접 활성화되거나 재정의를 통해 비활성화되고 System V 스크립트는 update-rc.d명령 ( /etc/rc*디렉토리 에서 심볼릭 링크를 관리함 ) service을 사용하여 활성화 또는 비활성화되므로 부팅시 서비스 활성화 또는 비활성화와 관련이없는 명령 .


34
  • systemd는 SysV와 호환됩니다.
  • 시작시 서비스를 병렬로로드
  • 서비스의 주문형 활성화를 제공합니다.
  • 의존성 기반
  • 그리고 더 많은 것 같아요 ...

당신이 언급 한 것보다 더 많은 것이 있습니다 systemctl.

systemd 유닛, 유닛, 유닛, 타겟, 서비스, 소켓 등 다른 유형의 유닛이 있습니다. 타겟은 런레벨과 같은 개념입니다.

systemctl기본 시스템 대상을 설정하거나 얻는 데 사용할 수 있습니다 .

systemctl get-default

다른 대상으로 이동할 수 있습니다.

systemctl isolate multiuser.target

다른 대상은 다중 사용자, 그래픽, 큐, 비상, 재부팅, 전원 끄기입니다.

당신이 말했듯이, 당신은 systemctl서비스를 관리하는 데 사용할 수 있습니다. 내가 알고있는 서비스 관리와 관련된 다른 명령은 다음과 같습니다.

# 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

이를 사용하여 서비스 상태를 확인할 수 있습니다.

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

서비스를 마스킹하거나 마스킹 해제 할 수 있습니다.

systemctl mask name.service
systemctl unmask name.service

연결될 서비스를 마스킹 /dev/null했으므로 다른 서비스는 수동 또는 자동으로 활성화 / 활성화 할 수 없습니다. (먼저 마스크를 해제해야합니다).

systemctl의 또 다른 사용법은 단위를 나열하는 것입니다.

systemctl list-units

로드되고 활성화 된 모든 종류의 장치를 나열합니다.

서비스 단위 나열 :

systemctl list-units --type=service

또는로드 및 활성화 된 장치뿐만 아니라 사용 가능한 모든 장치를 나열하려면 :

systemctl list-unit-files

별칭을 만들거나 원격 시스템을 제어 할 수도 있습니다

systemctl --host ravexina@192.168.56.4 list-units

반면에 service서비스 관리 및 다른 사람들의 비즈니스와는 아무런 관련이없는 일을해야합니다.)


1
그것은 완벽한 대답이었습니다. service할 수 있지만 할 수없는 것이 systemctl있습니까?
luv.preet

내가 아는 바는 없지만 서비스 맨 페이지 를 보는 것이 도움이 될 것이라고 생각합니다.
Ravexina

1
몇 가지 명백한 차이점이 있습니다. 구문은 하나입니다. 다른 하나는 systemv 스크립트가 내가 아는 한 소켓을 다루지 않았다는 것입니다. systemd가 네트워크 유형의 물건을 다루려고한다는 사실은 또 다른 것이며, 종종 비판의 대상입니다. 무엇보다도 systemd는 단순히 서비스를 시작하는 것 이상의 일을하려고 노력하고 있습니다
Sergiy Kolodyazhnyy

실패한 service start시도 에서 로그 메시지를 체계적으로 숨기는 것에 대해 불만을 제기하고 싶습니다 . 사전 시스템으로 service start서비스가 시작되지 않는 이유를 바로 확인할 수 있습니다. 포스트-시스템화 된, 나는 그것을 찾기 전에 4-5 개의 다른 로그를 봐야합니다. 내 의견은 의심 할 여지없이 주제가 아니며 아마도 삭제 될 것입니다.
Ross Presser

11
AFAICS이 답변은 service명령 에 대해 아무 것도 말하지 않는 것 같습니다 . 질문의 일부가 아니 었습니까?
ilkkachu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.