프로그래밍/운영체제

systemd Conflicts 기준 정리

포도알77 2026. 8. 1. 17:04

본문 중간의 쿠팡 추천 상품 구매시 쿠팡 파트너스에서 일정액의 수수료를 제공받습니다.

systemd Conflicts 기준 정리

systemd에서 두 유닛을 동시에 살아 있게 두면 안 될 때는 보통 Conflicts=를 검토한다. 다만 이 옵션은 "같이 있으면 안 된다"를 표현할 뿐, 어느 쪽을 먼저 내리고 올릴지까지 자동으로 결정해 주지는 않는다.

2026년 8월 1일 기준 freedesktop.org 공식 systemd.unit 문서를 보면 Conflicts=는 negative requirement dependency이고, 순서 제어는 After= 또는 Before=로 별도로 표현해야 한다. 이 글은 그 차이와 shutdown 시 기본 동작까지 함께 정리한다.

Conflicts=는 무엇을 의미할까?

공식 문서에 따르면 Conflicts=는 상충하는 유닛 목록을 선언하는 옵션이다. 한 유닛에 Conflicts=가 설정되어 있으면, 그 유닛이 시작될 때 충돌 대상이 이미 실행 중이면 대상 유닛을 정지시키는 방향으로 job이 정리된다.

핵심은 이 옵션이 "둘을 동시에 active 상태로 두지 않는다"는 관계를 표현한다는 점이다. 따라서 목적이 상호 배타성인지, 아니면 단순한 시작 순서 제어인지 먼저 구분해야 한다.

After=Before=를 같이 보아야 할까?

같은 공식 문서는 requirement dependency와 ordering dependency가 서로 독립적이라고 설명한다. 즉 Conflicts=만 선언해도 순서가 자동으로 생기지 않으며, 시작과 정지의 타이밍을 명확히 하고 싶다면 After= 또는 Before=를 추가해야 한다.

문서는 Conflicts=와 함께 순서 의존성을 선언할 수 있고, 이때는 After=Before=든 어느 쪽을 쓰더라도 stop job이 start job보다 먼저 정렬되므로 결과적으로 충돌 대상이 먼저 멈춘 뒤 다른 유닛이 시작된다고 설명한다.

[Unit]
Conflicts=rescue.service
Before=rescue.service

이런 식으로 쓰면 구조가 더 분명해진다. 상충 관계는 Conflicts=, 순서는 Before= 또는 After=가 맡는다는 점이 드러나기 때문이다.

옵션 역할 실무 해석
Conflicts= negative requirement dependency 둘을 동시에 active 상태로 두지 않음
After= ordering dependency 상대 유닛이 먼저 시작되거나, 종료 시에는 내가 먼저 멈춤
Before= ordering dependency 내가 먼저 시작되거나, 종료 시에는 상대가 먼저 멈춤

어떤 상황에서 쓰기 좋을까?

Conflicts=는 서로 배타적인 실행 모드가 있을 때 잘 맞는다. 예를 들어 특정 서비스가 rescue 환경과 동시에 살아 있으면 안 되거나, 서로 다른 초기화 경로가 같은 리소스를 독점해서 동시에 유지되면 안 되는 경우가 여기에 가깝다.

반대로 단순히 "이 유닛이 먼저 준비된 뒤에 시작하고 싶다"가 목적이라면 Conflicts=가 아니라 After=, Before=, 또는 필요에 따라 Wants=, Requires= 조합을 먼저 보는 편이 맞다. 상충 관계가 없는데 Conflicts=를 넣으면 동작이 과해질 수 있다.

 

 

shutdown.target과의 관계는 왜 자주 보일까?

공식 systemd.service 문서는 일반 서비스가 기본적으로 shutdown.target에 대해 Conflicts=Before= 의존성을 가진다고 설명한다. 문서의 표현대로 이는 정상적인 서비스가 시스템 종료 전에 정리되도록 하기 위한 기본 동작이다.

즉 사용자가 모든 서비스에 이 관계를 직접 적는 것이 아니라, 기본 의존성이 켜져 있는 일반 서비스라면 systemd가 이를 자동으로 추가한다. early boot나 late shutdown에 관여하는 특수 유닛이 아니라면 보통 이 기본값을 그대로 따른다.

After=Before= 중 무엇을 고를까?

공식 문서는 Conflicts=와 함께 둘 중 어느 ordering dependency를 써도 stop job이 start job보다 먼저 처리된다고 설명한다. 따라서 충돌 해소 자체만 놓고 보면 둘 다 가능하다.

실무에서는 사람이 읽기 쉬운 방향으로 맞추는 편이 낫다. 현재 유닛이 상대보다 먼저 올라가야 한다면 Before=, 상대가 먼저 올라온 뒤 내가 뒤따라야 한다면 After=로 쓰면 된다. 핵심은 충돌 관계와 순서 의도를 같이 남기는 것이다.

자주 묻는 질문

Q. Conflicts=만 있으면 상대 유닛을 자동으로 당겨와서 비교할까?

아니다. 공식 문서상 Conflicts=는 상충 관계를 선언하는 옵션이지, 시작 pull-in을 담당하는 옵션은 아니다. 상대를 함께 시작 대상으로 끌어오려면 별도의 requirement dependency가 필요할 수 있다.

Q. 순서 의존성은 왜 따로 선언해야 할까?

공식 문서가 requirement dependency와 ordering dependency를 별개의 축으로 설명하기 때문이다. 함께 존재할 수 없는 관계와 어느 쪽이 먼저 움직여야 하는지는 다른 문제다.

Q. 일반 서비스에 shutdown.target 관련 설정이 이미 있는 이유는 무엇일까?

공식 systemd.service 문서에 따르면 기본 의존성이 활성화된 일반 서비스는 shutdown.target에 대해 자동으로 Conflicts=Before=를 얻는다. 시스템 종료 전에 서비스를 정리하기 위한 기본 안전장치로 보면 된다.

정리

Conflicts=는 systemd에서 두 유닛을 동시에 active 상태로 두지 않겠다는 의도를 표현하는 옵션이다. 다만 실제 시작·정지 순서는 After=Before=가 담당하므로, 둘을 같은 개념으로 보면 헷갈리기 쉽다.

2026년 8월 1일 기준 공식 문서 기준으로 보면 판단 기준은 단순하다. 상호 배타성이 핵심이면 Conflicts=, 시작 pull-in은 Wants=Requires=, 순서 제어는 After=Before=로 나눠 생각하면 된다.

참고 자료

반응형
페이스북으로 공유카카오톡으로 공유카카오스토리로 공유트위터로 공유URL 복사