리눅스 시스템 시작 시 특정 프로그램을 자동으로 실행해야 할 경우가 있습니다. Systemd는 이러한 작업을 가능하게 하는 강력한 도구이며, 오늘날 대부분의 리눅스 배포판(Ubuntu 포함)에서 널리 사용됩니다. 이번 튜토리얼에서는 Systemd를 활용하여 부팅 시 자동으로 시작되는 사용자 정의 서비스 생성 과정을 안내하고, 서비스 작동 상태를 기록하는 저널과의 연동 방법까지 자세히 알아보겠습니다.
본 튜토리얼에서는 시스템 부팅 시 시작되는 서비스를 설정하는 방법을 설명합니다. 로그인 시 GUI 환경에서 실행되는 프로그램은 데스크톱 환경의 시작 관리자를 사용하는 것이 더 적합합니다.
부팅 시 프로그램 자동 실행 원리
컴퓨터에 설치된 일부 소프트웨어는 리눅스 부팅 프로세스와 연동되어 컴퓨터를 켤 때마다 자동으로 실행됩니다. 이러한 자동 실행 기능을 사용자 정의 프로그램, 스크립트 또는 다른 프로그램을 통해 구현할 수 있습니다. Systemd는 리눅스 시스템의 핵심 관리자로서 이러한 프로그램의 실행을 제어하며, 시스템 및 서비스 관리자 역할을 수행합니다. Systemd는 시스템 부팅 시 가장 먼저 실행되는 프로세스이며 항상 프로세스 ID (PID) 1을 가집니다. 시스템에서 실행되는 모든 다른 프로세스는 Systemd 또는 Systemd가 실행한 다른 프로세스에 의해 시작됩니다.
백그라운드에서 실행되는 프로그램을 데몬 또는 서비스라고 합니다. Systemd의 “d”는 데몬을 의미합니다. 본 튜토리얼에서는 예시 서비스를 만들어서, 다음과 같은 필수 요건을 갖추도록 할 것입니다.
- Systemd 서비스 유닛 파일을 통해 Systemd와 통합
- 부팅 시 자동 시작
- systemctl 명령을 이용한 제어 인터페이스 제공
- 저널에 로그 기록
실행할 서비스 프로그램 생성
Systemd에 의해 실행될 간단한 스크립트인 “htg.sh”를 만들어 보겠습니다. 텍스트 편집기로 Gedit을 사용하지만 다른 편집기를 사용해도 무방합니다.
touch htg.sh
gedit htg.sh
Gedit 편집기가 열리면 다음 코드를 붙여 넣으세요.
#!/bin/bash echo "htg.service: ## Starting ##" | systemd-cat -p info while : do TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') echo "htg.service: timestamp ${TIMESTAMP}" | systemd-cat -p info sleep 60 done
스크립트를 저장하고 편집기를 닫습니다.
이 스크립트는 복잡한 작업을 수행하지는 않지만 몇 가지 중요한 부분을 살펴볼 필요가 있습니다.
echo 명령어는 systemd-cat을 통해 저널로 메시지를 보냅니다. 메시지의 중요도는 `-p info` 옵션을 통해 정보 수준으로 설정됩니다. 무한 루프 안에서 현재 시간과 날짜를 기록하고, 60초 간격으로 저널에 정보를 기록합니다.
스크립트를 `/usr/local/bin` 디렉터리에 복사합니다.
sudo cp htg.sh /usr/local/bin
스크립트에 실행 권한을 부여합니다.
sudo chmod +x /usr/local/bin/htg.sh
서비스 유닛 파일 생성
Systemd는 실행되는 각 프로그램에 대해 서비스 유닛 파일이라는 정의 파일을 사용합니다. 이 파일에는 프로그램의 위치, 실행 방법, 동작 방식 등의 정보가 포함되어 있습니다. 새로운 서비스 유닛 파일을 만들기 전에 기존 파일과 이름이 충돌하지 않는지 확인하는 것이 좋습니다.
sudo systemctl list-unit-files --type-service
출력된 유닛 파일 목록에서 원하는 이름을 사용하는 유닛 파일이 없는지 확인합니다.
여기서는 “htg.service”라는 이름을 사용할 것이므로, 해당 이름의 서비스 유닛 파일이 없는 것을 확인한 후 다음 명령으로 새로운 유닛 파일을 만듭니다.
sudo gedit /etc/systemd/system/htg.service
Gedit 편집기가 열리면 다음 텍스트를 붙여넣습니다.
[Unit] Description=How-To Geek Service Example Wants=network.target After=syslog.target network-online.target [Service] Type=simple ExecStart=/usr/local/bin/htg.sh Restart=on-failure RestartSec=10 KillMode=process [Install] WantedBy=multi-user.target
변경 사항을 저장하고 편집기를 닫습니다.
유닛 파일의 각 섹션과 항목은 다음과 같은 의미를 가집니다. 모든 서비스에 필수적인 항목은 아니지만, 이해를 돕기 위해 포함하였습니다.
- Description: 서비스에 대한 설명을 제공합니다.
- Wants: 서비스 시작 전 네트워크가 활성화되기를 바라지만, 필수 조건은 아닙니다.
- After: 이 서비스가 시작되기 전에 실행되어야 하는 다른 서비스 목록을 지정합니다.
- Type: 서비스 시작 유형을 정의합니다. 여기서는 단순 서비스로 설정하여 Systemd가 `ExecStart`에 지정된 프로세스가 분기되면 서비스가 시작된 것으로 간주합니다.
- ExecStart: 시작해야 하는 프로세스의 경로를 지정합니다.
- Restart: 서비스가 실패했을 때 재시작할지 여부를 결정합니다.
- RestartSec: 서비스 재시작 전 대기 시간을 초 단위로 지정합니다.
- KillMode: systemctl로 서비스 중지 요청 시 프로세스를 종료하는 방법을 정의합니다. 여기서는 `process`로 설정하여 메인 프로세스에만 SIGTERM 신호를 보냅니다.
- WantedBy: 서비스를 시작해야 할 때를 지정합니다. `multi-user.target`으로 설정하면 여러 사용자가 로그인할 수 있는 상태가 되면 서비스가 시작됩니다.
유닛 파일은 실행 권한이 필요하지는 않지만, 권한 설정을 통해 파일 편집 가능자를 제한해야 합니다. 악의적인 사용자가 유닛 파일을 수정하여 다른 프로그램을 실행하는 것을 방지해야 합니다.
다음 명령으로 소유자에게 읽기 및 쓰기 권한을, 그룹에게는 읽기 권한을 부여합니다.
sudo chmod 640 /etc/systemd/system/htg.service
아직 서비스가 실행되지 않았지만, 다음 명령으로 유닛 파일 구문 오류를 확인할 수 있습니다.
systemctl status htg.service
에러가 발생하지 않았다면 유닛 파일의 구문이 올바른 것입니다.
서비스 시작하기
새로운 유닛 파일을 추가하거나 기존 파일을 변경했다면, Systemd 데몬을 재시작해야 합니다.
sudo systemctl daemon-reload
부팅 시 서비스가 자동으로 시작되도록 활성화합니다.
sudo systemctl enable htg
서비스 활성화는 서비스를 바로 시작하지 않으며, 다음 부팅 시 서비스가 시작되도록 설정하는 것입니다. 현재 서비스 실행을 위해서는 다음 명령을 실행해야 합니다.
sudo systemctl start htg
서비스 작동 상태 확인
수동으로 시작하거나 컴퓨터를 재부팅한 후, 서비스가 정상적으로 작동하는지 확인할 수 있습니다.
sudo systemctl status htg.service
서비스 상태를 확인하면 다음 정보를 얻을 수 있습니다.
- 초록색 점은 서비스가 정상적으로 실행 중임을 나타냅니다.
- 서비스 이름은 “htg.service”이며, 유닛 파일에 정의된 설명이 표시됩니다.
- 유닛 파일 위치(/etc/systemd/system/htg.service)가 표시됩니다.
- 서비스 활성화 상태와 시작된 시간이 표시됩니다.
- 서비스 프로세스 ID(PID)가 표시됩니다.
- 서비스와 관련된 작업 정보가 표시됩니다.
- 서비스에서 사용 중인 메모리 정보가 표시됩니다.
- 서비스 실행에 사용되는 제어 그룹 정보가 표시됩니다.
또한 서비스에서 생성된 최근 저널 항목 10개가 표시되며, 모두 1분 간격으로 기록된 것을 확인할 수 있습니다.
서비스 중지 및 비활성화
서비스를 중지하려면 다음 명령어를 사용합니다.
sudo systemctl stop htg.service
이 명령은 서비스를 중지하지만, 다음 부팅 시 서비스가 다시 시작되는 것을 막지는 않습니다. 부팅 시 서비스 시작을 완전히 중지하려면 다음 명령을 사용해야 합니다.
sudo systemctl disable htg.service
이 명령은 서비스가 실행 중인 경우에도 현재 서비스를 중지하지는 않습니다. 다음 재부팅 시 서비스가 시작되지 않도록 Systemd에 지시할 뿐입니다.
서비스를 완전히 중지하고 다음 부팅 시에도 시작되지 않도록 하려면 위에서 언급한 두 개의 명령어를 모두 실행해야 합니다.
서비스 사용 시 유의사항
서비스로 등록하기 전에 프로그램이 예상대로 작동하는지 먼저 확인하는 것이 중요합니다.