systemd로 시작 시 Linux 프로그램을 실행하는 방법

부팅 시 Linux 프로그램을 시작해야 합니까? systemd 소프트웨어는 systemd가 있는 모든 Linux 배포판에서 수행할 수 있는 방법을 제공합니다. 이는 Ubuntu를 포함하여 오늘날 대부분입니다. 통합 서비스를 만드는 과정을 안내하고 저널과도 통신합니다.

이 튜토리얼은 시스템을 시작할 때 시작되는 시스템 서비스를 설정하는 방법을 보여줍니다. 로그인할 때 그래픽 프로그램을 실행하려면 데스크탑의 시작 관리자를 대신 사용하십시오.

시작 시 프로그램 실행

컴퓨터에 설치한 소프트웨어가 Linux 시작 프로세스에 연결되어 컴퓨터가 시작될 때마다 프로그램이 자동으로 실행되는 경우가 있습니다. 자신의 프로그램과 스크립트 또는 실제로 컴퓨터에 있는 다른 프로그램을 사용하여 이와 동일한 동작을 쉽게 수행할 수 있습니다.

시작할 때 실행되는 프로그램은 systemd에 의해 제어되며, 시스템과 서비스 관리자. systemd는 시작 시 실행되는 첫 번째 프로세스입니다. 그것은 항상 가지고있다 프로세스 ID (PID) 1. 컴퓨터에서 실행 중인 다른 모든 프로세스는 systemd에 의해 시작되거나 systemd가 이미 시작한 프로세스에 의해 시작됩니다.

백그라운드에서 실행되는 프로그램을 호출 데몬 또는 서비스. systemd 끝의 “d”는 데몬을 나타냅니다. 이 문서에서는 예제 서비스를 만듭니다. 모든 확인란을 선택하려면 서비스가 다음과 같아야 합니다.

서비스 유닛 파일을 통해 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

변경 사항을 저장하고 편집기를 닫습니다.

  fail2ban으로 Linux 서버를 보호하는 방법

스크립트는 많은 작업을 수행하지 않지만 주목할 가치가 있는 몇 가지 사항이 있습니다.

두 개의 에코 라인은 다음을 수행하는 프로그램인 systemd-cat을 통해 연결됩니다. 프로그램에서 출력하여 저널에 보냅니다.. 저널에 등록된 항목이 우선 적용됩니다. -p(우선순위) 옵션을 사용하여 메시지가 정보(정보) 전용임을 나타냅니다. 중요한 오류나 경고가 아닙니다.
끝없는 while 루프가 있습니다.
TIMESTAMP 변수는 현재 날짜 및 시간으로 설정됩니다. 이것은 메시지로 형식화되어 저널에 전송됩니다.
그런 다음 스크립트는 60초 동안 절전 모드로 전환됩니다.
60초 후에 루프가 반복됩니다. 따라서 이 스크립트는 1분에 한 번씩 타임스탬프가 찍힌 메시지를 저널에 씁니다.

스크립트를 /usr/local/bin 디렉토리에 복사합니다.

sudo cp htg.sh /usr/local/bin

그리고 우리는 그것을 실행 가능하게 만들어야 합니다:

sudo chmod +x /usr/local/bin/htg.sh

서비스 단위 파일 생성

systemd에 의해 시작되는 각 프로그램에는 서비스 단위 파일이라는 정의 파일이 있습니다. 이것은 systemd가 프로그램을 찾아 실행하고 일부 동작을 정의하는 데 사용할 수 있는 특정 속성을 보유합니다.

새 서비스에 대한 단위 파일을 만들어야 하지만 기존 단위 파일에 새 서비스에 부여하려는 이름이 없는지 확인하는 것이 좋습니다.

sudo systemctl list-unit-files --type-service

가나다순으로 정렬된 단위 파일 목록을 스크롤하여 사용하려는 이름이 사용되지 않았는지 확인할 수 있습니다.

우리 서비스는 “ht.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

변경 사항을 저장하고 편집기를 닫습니다.

항목에는 다음과 같은 의미가 있습니다. 일반적인 항목입니다. 우리의 간단한 서비스에는 실제로 대부분이 필요하지 않지만 포함하면 설명할 수 있습니다.

설명: 서비스에 대한 텍스트 설명입니다.
원함: 우리 서비스는 서비스가 시작되기 전에 네트워크가 가동되기를 원하지만 요구하지는 않습니다.
이후: 이 서비스가 성공적으로 시작된 후 시작되어야 하는 장치 이름 목록(아직 실행 중이 아닌 경우).
유형: 단순합니다. systemd는 ExecStart에 의해 지정된 프로세스가 분기되는 즉시 이 서비스가 시작된 것으로 간주합니다.
ExecStart: 시작해야 하는 프로세스의 경로입니다.
다시 시작: 서비스를 다시 시작해야 하는 시기와 여부입니다. 우리는 그것을 “실패시”로 설정했습니다.
RestartSec: 서비스를 다시 시작하기 전에 대기하는 시간입니다. 이 값은 초 단위입니다.
KillMode: systemctl에 서비스 중지를 요청할 경우 systemd가 프로세스를 종료하는 방법을 정의합니다. 우리는 이것을 “처리”로 설정했습니다. 이로 인해 systemd는 주 프로세스에서만 SIGTERM 신호를 사용합니다. 우리 서비스가 간단한 스크립트가 아닌 간단한 프로그램이라면 생성된 프로세스도 종료되도록 이것을 “혼합”으로 설정합니다.
WantedBy: “multi-user.target”으로 설정되어 있습니다. 즉, 그래픽 사용자 인터페이스를 사용할 수 있는지 여부에 관계없이 시스템이 여러 사용자가 로그인할 수 있는 상태에 있는 한 서비스가 시작되어야 합니다.

  Irssi를 설치하고 Linux 터미널에서 IRC를 사용하는 방법

단위 파일은 실행 가능하지 않아도 되지만 단위 파일에 대한 권한은 편집할 수 있는 사람을 제한해야 합니다. 악의적이거나 장난꾸러기 사용자가 단위 파일을 변경하여 다른 프로그램을 완전히 실행하는 것을 원하지 않습니다.

이 명령은 소유자에게 읽기 및 쓰기 권한과 그룹에 대한 읽기 권한을 부여합니다. 다른 사람들은 권한이 없습니다.

sudo chmod 640 /etc/systemd/system/htg.service

서비스가 아직 실행되지 않더라도 systemctl이 우리 단위 파일의 구문을 검사하도록 할 수 있습니다. 모든 오류가 보고됩니다. (사실 “.service” 부분은 대부분의 명령어에서 선택 사항입니다.)

systemctl status htg.service

오류가 강조 표시되지 않습니다. 이는 단위 파일이 구문적으로 정확함을 의미합니다.

서비스 시작

새 단위 파일을 추가하거나 기존 파일을 편집할 때 단위 파일 정의를 다시 로드하도록 systemd에 알려야 합니다.

sudo systemctl daemon-reload

시작할 때 서비스를 시작하려면 다음을 활성화해야 합니다.

sudo systemctl enable htg

서비스를 활성화하면 서비스가 시작되지 않고 부팅 시 시작되도록 설정됩니다. 지금 서비스를 시작하려면 시작 옵션과 함께 systemctl을 사용해야 합니다.

sudo systemctl start htg

서비스 확인

서비스를 수동으로 시작한 후 또는 컴퓨터를 재부팅한 후 서비스가 올바르게 실행되고 있는지 확인할 수 있습니다.

sudo systemctl status htg.service

서비스 상태가 표시됩니다.

녹색 점은 서비스가 원활하게 실행되고 있음을 의미합니다.
서비스 이름은 “htg.service”이고 긴 설명은 단위 파일에서 제공한 것입니다.
“/etc/systemd/system/htg.service”가 로드된 단위 파일이 표시됩니다.
서비스가 활성화되어 있으며 서비스가 시작된 시간이 표시됩니다.
PID는 7762입니다.
서비스와 관련된 두 가지 작업이 있습니다.
총 928 메모리의 키비바이트 서비스에서 사용 중입니다.
제어 그룹에는 “htg.sh” 스크립트와 “htg.sh”에 의해 시작된 sleep 명령이 포함됩니다. 대부분의 경우 sleep 명령이 이 서비스에 대한 작업을 수행합니다.

또한 이 서비스에서 생성된 최근 10개의 저널 항목도 표시됩니다. 놀랍게도 모두 1분 간격입니다.

서비스 중지 및 비활성화

서비스를 중지해야 하는 경우 다음 명령으로 중지할 수 있습니다.

sudo systemctl stop htg.service

이렇게 하면 서비스가 중지되지만 다음에 컴퓨터를 재부팅할 때 서비스가 다시 시작되는 것은 아닙니다. 시작 시 서비스 시작을 중지하려면 서비스를 비활성화해야 합니다.

sudo systemctl disable htg.service

서비스가 실행 중인 경우 이 명령은 서비스를 중지하지 않습니다. 단순히 다음 재부팅 시 서비스를 시작하지 않도록 systemd에 지시합니다.

  Podfox를 사용하여 Linux 터미널에서 Podcast를 다운로드하는 방법

서비스를 중지하고 시작 시 시작되지 않도록 하려면 두 명령을 모두 사용하십시오.

서비스 팁

서비스로 시작하기 전에 프로그램이 예상대로 실행되는지 확인하십시오.