웹사이트 검색

Systemd에서 새로운 서비스 단위를 생성하고 실행하는 방법


며칠 전 저는 Centos 8 32비트 배포판을 발견했고 이를 오래된 32비트 시스템에서 테스트하고 싶은 마음을 느꼈습니다. 부팅한 후 버그가 있고 네트워크 연결이 끊어지고 있다는 것을 깨달았습니다. 부팅 후 매번 수동으로 '업'해야 했습니다. 그렇다면 문제는 컴퓨터를 부팅할 때마다 실행되는 이 작업을 수행하는 스크립트를 어떻게 설정할 수 있느냐는 것이었습니다.

글쎄, 이것은 매우 간단하며 서비스 단위를 사용하는 시스템 방식을 보여 드리겠습니다. 하지만 먼저 서비스 단위에 대한 간략한 소개를 하겠습니다.

이 글에서는 systemd의 "서비스 단위"가 무엇인지, 그리고 이를 만들고 실행하는 것이 얼마나 쉬운지 설명하겠습니다. '목표'가 무엇인지, 왜 '단위 모음'이라고 부르는지, 그리고 '원하는 것'은 무엇인지 단순화하려고 노력하겠습니다. 마지막으로 서비스 유닛을 활용하여 부팅 절차 후에 자체 스크립트를 실행합니다.

컴퓨터가 제공하는 서비스로 인해 컴퓨터가 유용하다는 것은 분명하며, 이 기능을 갖기 위해서는 컴퓨터가 부팅되고 다양한 수준에 도달할 때 많은 서비스를 호출해야 합니다.

예를 들어 컴퓨터가 복구 수준(런레벨 0)에 도달하면 실행되도록 다른 서비스가 호출되고 다중 사용자 수준(런레벨 3)에 도달하면 다른 서비스도 호출됩니다. . 이러한 수준을 타겟으로 상상할 수 있습니다.

간단히 말해서 target은 서비스 단위의 모음입니다. graphical.target 수준에서 실행 중인 서비스 단위를 보려면 다음을 입력하세요.

systemctl --type=service

보시다시피 일부 서비스는 활성 상태이고 항상 "실행 중"인 반면, 다른 서비스는 한 번만 실행되고 종료(종료)됩니다.

서비스 상태를 확인하려면 다음과 같이 systemctl 명령을 사용하면 됩니다.

systemctl status firewalld.service

보시다시피 firewalld.service의 상태를 확인했습니다(팁: 서비스 이름 자동 완성 기능을 사용할 수 있습니다) ). 방화벽 서비스가 항상 실행 중이고 활성화되어 있다고 알려줍니다.

활성화 및 비활성화는 각각 다음 부팅 중에 서비스가 영구적으로 로드되거나 로드되지 않음을 의미합니다. 반면, 서비스를 시작하고 중지하는 것은 현재 세션의 제한이 있으며 영구적이지 않습니다.

예를 들어 다음을 입력하는 경우:

systemctl stop firewalld.service
systemctl status firewalld.service

firewalld.service가 비활성(죽음)이지만 여전히 활성화되어 있는 것을 볼 수 있습니다. 이는 다음 부팅 중에 로드된다는 의미입니다. 따라서 나중에 부팅할 때 서비스를 로드하려면 해당 서비스를 활성화해야 합니다. 정말 훌륭한 결론입니다! 하나 만들어 봅시다. 쉽습니다.

폴더로 이동하면 다음과 같습니다.

cd /etc/systemd/system
ls -l

단위 서비스의 일부 링크 파일과 대상의 “원하는” 일부 디렉토리를 볼 수 있습니다. 예를 들어, 부팅 절차가 해당 수준에 도달할 때 다중 사용자 대상이 로드하려는 내용은 /etc/systemd/system/multi-user.target.wants/라는 이름의 디렉터리에 나열됩니다. .

ls multi-user.target.wants/

보시다시피 여기에는 서비스뿐만 아니라 서비스 모음인 다른 대상도 포함되어 있습니다.

connection.service라는 이름의 서비스 유닛을 만들어 보겠습니다.

vim connection.service

다음을 입력(삽입 모드의 경우 “i ” 누르기)하고 저장한 후 종료합니다(“esc ”“:wq! ” 사용). ) :

[Unit]
Description = making network connection up
After = network.target

[Service]
ExecStart = /root/scripts/conup.sh

[Install]
WantedBy = multi-user.target

위 내용을 설명하자면: 서비스 유형 단위를 생성했으며(대상 유형의 단위도 생성할 수 있음) network.target 다음에 로드되도록 설정했습니다( 부팅 절차가 정의된 순서로 대상에 도달함) 서비스가 시작될 때마다 우리가 만들 conup.sh 이름의 bash 스크립트를 실행하기를 원합니다.

재미는 마지막 부분인 [install]부터 시작됩니다. “multi-user.target ”이 이를 원할 것임을 알려줍니다. 따라서 서비스를 활성화하면 해당 서비스에 대한 심볼릭 링크가 multi-user.target.wants 폴더 내에 생성됩니다! 알았어요? 그리고 이를 비활성화하면 해당 링크가 삭제됩니다. 아주 간단합니다.

활성화하고 확인해보세요:

systemctl enable connection.service

multi-user.target.wants 폴더에 심볼릭 링크가 생성되었음을 알려줍니다. 표시된 대로 ls 명령을 실행하여 확인할 수 있습니다.

ls multi-user.target.wants/

보시다시피 “connection.service”는 다음 부팅을 위한 준비가 되어 있지만 먼저 스크립트 파일을 생성해야 합니다.

cd /root
mkdir scripts
cd scripts
vim conup.sh

Vim 안에 다음 줄을 추가하고 저장하세요.

#!/bin/bash
nmcli connection up enp0s3

enp0s3 인터페이스에 대한 네트워크 연결을 시작하는 nmcli 명령입니다.

물론, 스크립트가 다른 것을 실행하도록 하려면 두 번째 줄 대신 원하는 것을 입력할 수 있습니다.

예를 들어,

#!/bin/bash
touch /tmp/testbootfile

그러면 /tmp 폴더 안에 파일이 생성됩니다(서비스가 작동하는지 확인하기 위해).

또한 표시된 대로 chmod 명령을 실행하여 스크립트를 실행 가능하게 만들어야 합니다.

chmod +x conup.sh

이제 준비가 되었습니다. 다음 부팅까지 기다리지 않으려면(이미 활성화되어 있음) 다음을 입력하여 현재 세션에 대한 서비스를 시작할 수 있습니다.

systemctl start connection.service

짜잔! 내 연결이 작동 중입니다!

기능을 확인하기 위해 스크립트 내에 "touch /tmp/testbootfile " 명령을 작성하기로 선택한 경우 /tmp 폴더 내에 이 파일이 생성된 것을 볼 수 있습니다. .

부팅 중 서비스, 원하는 것, 대상 및 스크립트 실행이 무엇인지 파악하는 데 도움이 되기를 바랍니다.