systemd 템플릿 인스턴스를 심볼릭 링크하거나 별칭을 지정하는 방법은 무엇입니까?

systemd 템플릿 인스턴스를 심볼릭 링크하거나 별칭을 지정하는 방법은 무엇입니까?

일반화하다

시스템 템플릿 단위가 있는 경우 [email protected]특정 템플릿 인스턴스에 대한 별칭(예: bar.service바로가기) 을 심볼릭 링크하거나 생성하려면 어떻게 해야 합니까 [email protected]?

배경

docker-compose로 실행되는 여러 서비스가 있습니다.

/var/docker-compose/nginx/docker-compose.yml
/var/docker-compose/nextcloud/docker-compose.yml
/var/docker-compose/diaspora/docker-compose.yml

systemd를 사용하여 이러한 서비스를 관리하기 위해 다음을 사용했습니다.템플릿 단위 사용 방법모든 docker-compose 단위 파일이 거의 동일하므로 중복을 피하기 위해.

# /etc/systemd/system/[email protected]

[Unit]
Description=%i service with docker compose
Requires=docker.service
After=docker.service

[Service]
Restart=always

WorkingDirectory=/var/docker-compose/%i

# Remove old containers, images and volumes
ExecStartPre=/usr/bin/docker-compose down -v
ExecStartPre=/usr/bin/docker-compose rm -fv
ExecStartPre=-/bin/bash -c 'docker volume ls -qf "name=%i_" | xargs docker volume rm'
ExecStartPre=-/bin/bash -c 'docker network ls -qf "name=%i_" | xargs docker network rm'
ExecStartPre=-/bin/bash -c 'docker ps -aqf "name=%i_*" | xargs docker rm'

# Compose up
ExecStart=/usr/bin/docker-compose up %i

# Compose down, remove containers and volumes
ExecStop=/usr/bin/docker-compose down -v

[Install]
WantedBy=multi-user.target

표적

이제 개별 서비스에 별칭이나 심볼릭 링크를 제공하여 서비스를 시작하고 중지하는 데 걸리는 시간을 단축하고 싶습니다.

대신에

systemctl stop docker-compose@nginx

입력하고 싶은 항목:

systemctl stop nginx

작동하지 않는 것

  • 심볼릭 링크를 생성하려고 합니다.

    cd /etc/systemd/system
    ln -s [email protected] nginx.service
    

    하지만 nginx.service시작하거나 중지하려고 할 때 찾을 수 없습니다.

  • 템플릿 단위에서 별칭을 정의해 보았습니다.

    [Install]
    Alias=%i.service
    

    그러나 내가 올바르게 이해한다면 이것은허용되지 않음이것은 나에게 효과가 없습니다.

  • 기본 단위 파일을 "가져오기" 또는 "요구"하고 해당 줄을 재정의하는 방법을 찾지 못했습니다 WorkingDirectory. 그런 다음 다음과 같은 별도의 짧은 파일을 만들 수 있습니다.

    # /etc/systemd/system/nginx.service
    
    [email protected]
    
    WorkingDirectory=/var/docker-compose/nginx
    

감사해요!

답변1

-대시( )가 포함된 셀 이름으로 간주되는 속성을 사용해 보았습니다.아치리눅스 맨페이지, 그리고 그것은 작동했습니다 :

또한 대시( )가 포함된 유닛 이름의 경우 -대시 뒤의 모든 유닛 이름을 반복적으로 잘라서 생성된 디렉터리 집합도 검색됩니다. 특히, 단위 이름의 경우 foo-bar-baz.service일반 삽입 디렉터리뿐만 아니라 및 foo-bar-baz.service.d/도 검색됩니다 .foo-bar-.service.d/foo-.service.d/

매뉴얼 페이지의 또 다른 참고 사항은 다음과 같습니다.

유닛 파일 외에도 foo.service"insert" 디렉터리가 있을 수 있습니다. 이 디렉토리에 foo.service.d/접미사가 있는 모든 파일은 .conf영숫자 순서로 병합되고 기본 장치 파일 자체 다음에 구문 분석됩니다.

/etc/systemd/system/내 작업 예에서 이것은 내 유닛 검색 경로(예: ) 의 루트에 있는 파일의 최종 구조입니다 .

│    docker-a.service
│    docker-b.service  
│    docker-c.service
└─── docker-.service.d
    │    docker.conf
             

또한 docker.conf파일은 docker-a.service다음과 같습니다.

# /etc/systemd/system/docker-.service.d/docker.conf

[Unit]
Description=We named our service [%j] service
After=network.target

[Service]
WorkingDirectory=/home/arman/%j
ExecStartPre=/bin/bash -c 'echo "The prestart command for %j was done!" >> log.txt'
ExecStart=/bin/bash -c 'echo "The start command for %j was done!" >> log.txt'

# /etc/systemd/system/docker-a.service

[Install]
WantedBy=multi-user.target
Alias=a.service

나는 다음 단계를 수행했습니다.

  1. 먼저, 장치 검색 경로 디렉터리의 루트와 같은 삽입 디렉터리를 만듭니다 docker-.service.d(예 /etc/systemd/system: ).
  2. 그런 다음 생성한 드롭 디렉터리와 유사한 파일을 생성 .conf하고 지정자를 사용하여 해당 파일에 및 섹션을 작성합니다.docker.conf[Unit][Service]%j

%j-: 접두사 이름의 마지막과 끝 사이의 문자열입니다.

  1. 그런 다음 루트 검색 경로의 삽입 디렉터리 옆에 원하는 각 서비스에 대한 서비스 파일을 만듭니다. [Install]options 를 사용하여 별칭이 명시적으로 결정된 부분 만 포함해야 합니다 Alias. (이 부분도 파일에 넣으려고 했는데 서비스가 시작되면 찾을 수 없습니다.) 참고로 이러한 서비스의 이름은 제약 조건을 충족해야 합니다 docker.conf.[Install]
  2. 이제 생성한 모든 서비스에 대해 실행하면 systemctl enable docker-{alias}.service그냥 통과할 수 있습니다 {alias}.

답변2

명령을 있는 그대로 수락하고 명령줄에서 bash 별칭을 사용하는 방법:

문서~/.bash_aliases

alias nginx-stop="systemctl stop docker-compose@nginx"
alias nginx-start="systemctl start docker-compose@nginx"
alias nextcloud-stop="systemctl stop docker-compose@nextcloud"
alias nextcloud-start="systemctl start docker-compose@nextcloud"
alias diaspora-stop="systemctl stop docker-compose@diaspora"
alias diaspora-start="systemctl start docker-compose@diaspora"

답변3

다음 솔루션은 systemd에 기본이 아니지만 systemd 서비스 파일 생성을 사용합니다.파일을 긁어 모으다.

해결책

이는 다음과 같이 가정합니다.루비호스트 시스템에 설치됩니다.

  1. 존재하는지 확인하십시오. 이 파일에서 서비스 이름으로 사용되는 변수입니다(예: "nginx")./etc/systemd/system/[email protected]%i

  2. 생성 :Rakefile/var/docker-compose/

    # /var/docker-compose/Rakefile
    
    TEMPLATE_SERVICE_FILE = "/etc/systemd/system/[email protected]"
    
    task :systemd_units do
      print "Creating systemd units:\n"
    
      Dir.glob("/var/docker-compose/*/docker-compose.yml").each do |compose_file|
        service_name = compose_file.split("/")[-2]
        unit_file = "/etc/systemd/system/#{service_name}.service"
        unit_file_content = File.read TEMPLATE_SERVICE_FILE
        unit_file_content.gsub! "%i", service_name
        File.write unit_file, unit_file_content
        print "#{unit_file}\n"
      end
    end
    
  3. rake디렉토리에서 실행하십시오 /var/docker-compose/.

/etc/systemd/system/nginx.service이는 템플릿 파일을 기반으로 각 서비스에 대해 별도의 단위 파일을 명시적으로 생성합니다 ./etc/systemd/system/[email protected]

이점:

  • systemctl start nginx일하다
  • systemctl enable nginx일하다
  • 탭 완성이 작동합니다

결점:

  • rake템플릿 파일을 변경하거나 docker-compose 디렉터리에서 서비스를 추가/제거할 때 이 작업을 다시 실행해야 합니다.

관련 정보