리눅스 생산성을 높이는 상위 5가지 systemctl 명령어

리눅스 서비스를 확인, 제어, 활성화, 목록화 및 다시 로드하는 다섯 가지 실용적인 systemctl 명령어

리눅스 생산성을 높이는 상위 5가지 systemctl 명령어

리눅스 시스템은 SSH 접속, 네트워킹, 로깅, 웹 서버, 데이터베이스, 예약 작업, 데스크톱 로그인 화면 등 거의 모든 작업에 백그라운드 서비스를 사용합니다. 이러한 서비스 중 하나가 제대로 작동하지 않을 때, 일반적으로 가장 먼저 사용하는 도구는 systemctl입니다.

systemctl은 많은 주류 리눅스 배포판에서 사용하는 서비스 관리자 systemd의 주요 명령줄 인터페이스입니다. 효과적으로 사용하기 위해 모든 하위 명령어를 외울 필요는 없습니다. 일상적인 작업에서는 소수의 명령어만으로 대부분의 서비스 확인, 재시작, 부트 구성 변경 및 유닛 파일 업데이트를 처리할 수 있습니다.

Systemd와 systemctl 이해하기

명령어를 살펴보기 전에 systemdsystemctl에 대해 간략히 알아보겠습니다. systemd는 시스템 초기화, 서비스 관리, 프로세스 처리 등을 담당합니다. 이전의 SysVinit나 Upstart와 같은 init 시스템을 대체하며, 더 빠른 부팅 시간, 병렬 서비스 시작, 더 강력한 종속성 관리를 제공합니다. systemctlsystemd 세계로의 창구 역할을 하여 서비스, 유닛 및 타겟의 상태를 제어하고 조회할 수 있게 해줍니다.

systemd 용어에서 '유닛(unit)'은 systemd가 관리하는 모든 리소스를 의미합니다. 서비스(.service), 마운트 지점(.mount), 장치(.device), 소켓(.socket), 타겟(.target)이 일반적인 유닛 유형입니다. 이 글에서는 주로 systemd가 관리하는 데몬 프로세스를 나타내는 서비스 유닛에 초점을 맞출 것입니다.

생산성 향상을 위한 상위 5가지 systemctl 명령어

리눅스 시스템의 서비스를 관리하고 모니터링하는 능력을 크게 향상시킬 다섯 가지 systemctl 명령어를 소개합니다.

1. systemctl status [SERVICE_NAME]

목적: 이 명령어는 서비스의 상태와 활동을 모니터링하는 첫 번째 방어선입니다. 서비스가 실행 중인지, 최근에 중지되었는지, 자동 시작이 활성화되었는지, 그리고 최근 로그 항목까지 포함한 상세 정보를 제공합니다.

생산성 향상 이유: 로그 파일을 수동으로 뒤지지 않고도 문제를 신속히 진단하고, 서비스 시작/종료를 확인하며, 서비스 상태를 한눈에 파악할 수 있습니다.

예시: Apache 웹 서버(httpd.service는 일부 배포판, Debian/Ubuntu 등에서는 apache2.service)의 상태를 확인하려면:

systemctl status apache2.service

출력 해석 (예시):

● apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2023-10-26 10:00:00 UTC; 1min 2s ago
       Docs: https://httpd.apache.org/docs/2.4/
    Process: 1234 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
   Main PID: 1239 (apache2)
      Tasks: 6 (limit: 4639)
     Memory: 21.6M
        CPU: 184ms
     CGroup: /system.slice/apache2.service
             ├─1239 /usr/sbin/apache2 -k start
             ├─1240 /usr/sbin/apache2 -k start
             └─1241 /usr/sbin/apache2 -k start

Oct 26 10:00:00 servername systemd[1]: Starting The Apache HTTP Server...
Oct 26 10:00:00 servername systemd[1]: Started The Apache HTTP Server.

이 출력은 다음을 알려줍니다:

  • Loaded: 유닛 파일의 위치와 부팅 시 시작하도록 활성화되었는지 여부.
  • Active: 현재 상태 (예: active (running), inactive (dead), failed).
  • journalctl의 최근 로그 항목.

: 상태 보기를 종료하려면 q를 누르세요.

status에서 놓치기 쉬운 두 가지 세부 사항이 있습니다. 첫째, Loaded:는 유닛 파일이 존재하는지와 부팅 시 활성화되었는지 알려줍니다. 서비스가 active (running)이면서도 disabled일 수 있습니다. 이는 수동으로 시작되었거나 다른 종속성에 의해 시작되었지만, 다음 부팅 시 반드시 시작되지는 않음을 의미합니다. 둘째, 마지막 로그 줄은 미리보기에 불과합니다. 유용한 오류가 스크롤되어 사라진 경우, status에서 모든 것을 확인하려고 하지 말고 journalctl -u apache2.service를 사용하세요.

스크립트 및 모니터링 확인에는 기계 친화적인 명령어를 선호하세요:

systemctl is-active --quiet apache2.service
systemctl is-enabled apache2.service

is-active --quiet는 서비스가 활성 상태일 때 종료 코드 0을 반환합니다. 이는 간단한 상태 확인에 유용합니다:

if ! systemctl is-active --quiet apache2.service; then
  echo "apache2가 실행 중이 아닙니다"
fi

2. systemctl start|stop|restart [SERVICE_NAME]

목적: 이 명령어들은 서비스의 런타임 수명 주기를 직접 제어할 수 있게 해줍니다.

  • start: 서비스를 시작합니다.
  • stop: 실행 중인 서비스를 중지합니다.
  • restart: 서비스를 중지했다가 다시 시작합니다 (구성 변경 사항 적용에 유용).

생산성 향상 이유: 기본적인 서비스 유지 관리, 문제 해결 및 구성 업데이트 적용에 필수적입니다. 전체 시스템을 재부팅하는 대신 개별 서비스를 정밀하게 제어할 수 있습니다.

예시: Apache 웹 서버를 중지하려면:

sudo systemctl stop apache2.service

다시 시작하려면:

sudo systemctl start apache2.service

구성 파일을 수정한 후 다시 시작하려면:

sudo systemctl restart apache2.service

경고: 이러한 명령어는 시스템 전체 서비스에 영향을 미치므로 일반적으로 sudo 권한이 필요합니다. 의도하지 않은 중단을 방지하기 위해 올바른 서비스를 대상으로 하는지 항상 확인하세요.

프로덕션 서비스에서는 restart를 신중하게 사용하세요. 프로세스를 중지했다가 다시 시작하므로, 애플리케이션이 정상 종료를 잘 처리하지 않으면 활성 연결이 끊어질 수 있습니다. 유닛이 리로드를 지원하는 경우, 구성만 변경한 후에는 다음 명령어가 더 나은 경우가 많습니다:

sudo systemctl reload nginx.service

모든 서비스가 리로드를 지원하는 것은 아닙니다. 유닛 정의를 확인하여 지원 여부를 확인하세요:

systemctl cat nginx.service | grep ExecReload

ExecReload=가 없으면 systemctl reload는 일반적으로 실패합니다. 이 경우 서비스를 다시 시작하거나 애플리케이션별 리로드 명령어를 사용하세요.

3. systemctl enable|disable [SERVICE_NAME]

목적: 이 명령어들은 시스템 부팅 시 서비스가 자동으로 시작될지 여부를 관리합니다.

  • enable: 부팅 시 서비스가 자동으로 시작되도록 구성합니다. 이는 적절한 systemd 타겟 디렉토리에서 서비스의 유닛 파일로 심볼릭 링크를 생성합니다.
  • disable: 심볼릭 링크를 제거하여 부팅 시 서비스가 자동으로 시작되지 않도록 합니다.

생산성 향상 이유: 리소스 사용을 제어하고, 부팅 시간을 최적화하며, 중요한 서비스가 항상 사용 가능하도록 하거나 불필요한 서비스가 실행되지 않도록 합니다.

예시: Apache가 시스템 부팅 시마다 시작되도록 하려면:

sudo systemctl enable apache2.service

불필요한 서비스(예: 인쇄를 사용하지 않는 경우 cups.service)가 부팅 시 시작되지 않도록 하려면:

sudo systemctl disable cups.service

모범 사례: 필요하지 않은 서비스는 비활성화하되, 먼저 해당 서비스에 의존하는 것이 무엇인지 확인하세요. 노트북에서 블루투스나 인쇄를 비활성화하는 것은 무해할 수 있습니다. 서버에서 종속성을 확인하지 않고 네트워크, 스토리지 또는 인증 서비스를 비활성화하면 잠기거나 부팅이 중단될 수 있습니다.

enabledisable은 부팅 동작에만 영향을 미친다는 점을 기억하세요. 현재 서비스를 시작하거나 중지하지는 않습니다. 두 작업을 함께 수행하려면 다음을 사용하세요:

sudo systemctl enable --now apache2.service
sudo systemctl disable --now cups.service

--now는 일반적인 실수(서비스를 활성화하고 이미 실행 중이라고 가정)를 방지하므로 유용합니다.

4. systemctl list-unit-files --type=service

목적: 이 명령어는 시스템에 알려진 모든 systemd 서비스 유닛 파일과 해당 enabled 또는 disabled 상태를 나열합니다. 이는 시스템에 구성된 서비스의 개요를 얻는 데 매우 유용합니다.

생산성 향상 이유: 설치된 서비스를 발견하고, 불필요한 서비스를 식별하며, 시스템의 부트 구성을 감사하는 데 도움이 됩니다. 시스템 정찰 및 정리를 위한 강력한 도구입니다.

예시:

systemctl list-unit-files --type=service

부분 출력 (예시):

UNIT FILE                                  STATE
acpid.service                              enabled
aptd-auto-update.service                   static
apt-daily.service                          static
apache2.service                            enabled
avahi-daemon.service                       enabled
bluetooth.service                          enabled
cups.service                               enabled
... (더 많은 서비스)

78 unit files listed.

: STATE 열은 서비스가 부팅 시 시작하도록 구성되었는지(enabled), 명시적으로 방지되었는지(disabled), 또는 static인지(직접 systemctl enable/disable로 활성화/비활성화할 수 없으며, 종종 종속성 또는 내부 systemd 유닛)를 나타냅니다.

필터링: 출력을 grep으로 파이프하여 특정 서비스를 찾을 수 있습니다:

systemctl list-unit-files --type=service | grep ssh

실행 중인 서비스에 관심이 있다면 list-units를 대신 사용하세요:

systemctl list-units --type=service --state=running
systemctl list-units --type=service --state=failed

이 구분은 정리 중에 중요합니다. list-unit-files는 systemd가 시작하는 방법을 알고 있는 것을 알려줍니다. list-units는 systemd가 현재 런타임 상태에서 로드한 것을 알려줍니다.

5. systemctl daemon-reload

목적: systemd 유닛 파일을 수정한 후(예: /etc/systemd/system/에 새 서비스 파일을 생성하거나 기존 파일을 편집), systemd는 이러한 변경 사항을 자동으로 인식하지 않습니다. systemctl daemon-reloadsystemd에게 모든 유닛 파일을 다시 스캔하고 구성을 다시 로드하도록 지시합니다.

생산성 향상 이유: 서비스 구성 변경 사항을 적용하기 위해 전체 시스템을 재부팅할 필요가 없습니다. 서비스 구성을 자주 수정하는 개발자와 관리자에게 중요합니다.

예시: 사용자 정의 애플리케이션 mywebapp.service에 대한 새 서비스 유닛 파일을 생성했다고 가정합니다.

  1. /etc/systemd/system/mywebapp.service를 생성합니다.

  2. systemd 구성을 다시 로드합니다:

    
    

sudo systemctl daemon-reload ```

  1. 이제 systemdmywebapp.service를 인식하며, start, enable, status를 사용할 수 있습니다:

    
    

sudo systemctl start mywebapp.service sudo systemctl enable mywebapp.service systemctl status mywebapp.service ```

중요: daemon-reload유닛 정의만 다시 로드합니다. 서비스가 이미 실행 중인 경우, 유닛 파일의 변경 사항은 서비스가 다시 시작될 때까지(systemctl restart [SERVICE_NAME]) 적용되지 않습니다.

간단한 일상 워크플로우

익숙하지 않은 서버에 접속하면 일반적으로 다음 순서로 작업합니다:

systemctl status sshd.service
systemctl list-units --type=service --state=failed
systemctl list-unit-files --type=service | grep enabled
systemctl get-default

이를 통해 호스트에 대한 빠른 그림을 얻을 수 있습니다: 원격 접속이 정상인지, 실패한 유닛이 있는지, 부팅 시 시작하도록 구성된 것은 무엇인지, 머신이 서버 스타일 또는 그래픽 타겟으로 부팅될 것으로 예상되는지.

서비스 변경의 경우 워크플로우는 동일하게 짧습니다:

sudo systemctl edit myapp.service
sudo systemctl daemon-reload
sudo systemctl restart myapp.service
systemctl status myapp.service
journalctl -u myapp.service -n 50 --no-pager

이 순서는 변경 사항을 표시하고, systemd의 유닛 캐시를 다시 로드하고, 영향을 받는 서비스만 다시 시작하고, 떠나기 전에 로그를 확인합니다. 이는 많은 피할 수 있는 재부팅과 추측을 방지합니다.

몇 가지 유용한 변형

핵심 명령어가 자연스러워지면 기본 워크플로우를 변경하지 않고 시간을 절약하는 몇 가지 변형을 추가하세요.

실패한 유닛만 보려면:

systemctl --failed

이는 재부팅 후 가장 빠른 확인 중 하나입니다. 패키지 업그레이드로 유닛이 변경되었거나, 마운트 시간이 초과되었거나, 사용자 정의 서비스가 부팅 중 충돌한 경우 사용자가 문제를 보고하기 전에 여기에 표시되는 경우가 많습니다.

systemd가 로드한 정확한 유닛 내용을 검사하려면:

systemctl cat docker.service

이는 기억하고 있는 편집한 파일이 전체 이야기가 아닐 수 있기 때문에 중요합니다. /usr/lib/systemd/system/의 패키지 유닛은 /etc/systemd/system/docker.service.d/ 아래의 하나 이상의 드롭인에 의해 수정될 수 있습니다. systemctl cat은 결합된 보기를 표시하므로 잘못된 파일을 디버깅하지 않습니다.

서비스가 부팅 시 시작되는 이유를 확인하려면:

systemctl list-dependencies multi-user.target
systemctl list-dependencies graphical.target

이는 누군가 "이게 왜 실행 중이지?"라고 물을 때 도움이 됩니다. 서비스는 직접 활성화되거나, 타겟에 의해 당겨지거나, 소켓 활성화되거나, 다른 유닛에 의해 시작될 수 있습니다. 부팅 동작은 종종 활성화/비활성화 문제가 아니라 종속성 문제입니다.

페이저를 열지 않고 최근 로그를 확인하려면:

journalctl -u sshd.service -n 50 --no-pager

systemctl status는 작은 로그 미리보기를 제공하지만, journalctl은 시간 범위, 부트, 줄 수 및 출력 형식을 제어할 수 있게 해줍니다. 예를 들어:

journalctl -u sshd.service --since "today" --no-pager
journalctl -u sshd.service -b -1 --no-pager

두 번째 명령어는 이전 부트를 확인하므로 충돌 또는 예기치 않은 재부팅 후에 유용합니다.

가장 긴 systemctl 명령어를 사용하는 데 상이 있는 것은 아닙니다. 생산성은 현재 질문에 답하는 작은 명령어를 아는 데서 옵니다: 실행 중인가, 부팅 시 시작해야 하는가, 무엇이 실패했는가, 무엇이 변경되었는가, systemd가 내가 편집한 정의를 다시 로드했는가.

공유 머신에서 도움이 되는 한 가지 습관: 변경한 내용의 증거를 남기세요. 서비스를 비활성화하는 경우 티켓, 런북 또는 변경 로그에 이유를 기록하세요. 6개월 후에 누군가 disabled를 보고 실수라고 생각할 수 있습니다. 명령어는 쉽습니다:

sudo systemctl disable --now old-worker.service

운영 컨텍스트는 사람들이 잃는 부분입니다. 타이머로 대체되었나요? 중복 작업을 유발했나요? 마이그레이션 중에만 필요했나요? systemctl은 상태를 표시할 수 있지만 의도를 설명할 수는 없습니다. 변경 사항 옆에 짧은 메모를 남기면 다음 사람이 좋은 결정을 취소하는 것을 방지할 수 있습니다.