시스템 : 인스턴스화 된 서비스의 모든 인스턴스를 한 번에 다시 시작


17

나는 systemd : Instantiated Services의 멋진 기능을 사용합니다.

한 번의 호출로 모든 인스턴스화 된 서비스를 다시로드하는 간단한 방법이 있습니까?

예 : 다음과 같이 모두 실행하고 싶지 않습니다.

systemctl restart autossh@foo
systemctl restart autossh@bar
systemctl restart autossh@blu

나는 이것을 시도했지만 이것은 작동하지 않는다

systemctl restart autossh@*

관련 : 하나의 시스템 서비스 파일로 N 프로세스 시작

최신 정보

먼저 Instantiated Services에 매료되었지만 나중에 Ansible과 같은 구성 관리 도구를 실행하는 것이 더 의미가 있음을 깨달았습니다. 나는 배웠다 : 도구를 단순하게 유지하십시오. 많은 도구가 조건 검사 (if .. else ...) 및 루프를 구현하기 시작합니다. 예를 들어 웹 서버 또는 메일 서버 구성 그러나 이것은 다른 (상위) 수준 인 구성 관리에서 해결되어야합니다. 참조 : https://github.com/guettli/programming-guidelines#dont-use-systemd-instantiated-units

답변:


23

Systemd (systemd-209에서 시작)는 와일드 카드를 지원하지만 쉘에서 확장을 시도하고있을 가능성이 있습니다. 따옴표를 사용하여 와일드 카드를 systemctl / service 명령에 그대로 전달하십시오.

systemctl restart 'autossh@*'

나를 위해 작동하지 않습니다 : systemctl status 'autossh@*'출력 : autossh@\x2a.service - ... Active: inactive (dead)버전 :systemd 195
guettli

2
: 글 로빙는 systemd (209)에서 사용할 시작 lists.freedesktop.org/archives/systemd-devel/2014-February/...
weirdan

다시 시작해야 할 서비스가 많으면 와일드 카드가 한 번에 모두 다시 시작하려고하는 것처럼 guettli의 응답에있는 while 루프가 더 잘 작동합니다. ~ 1000 php-fpm 서비스로 테스트 한 결과로드가 400까지 올라 갔고 서버를 재부팅해야했습니다.
boutch55555

1
프로세스가 이미 실행 중이지만 활성화 된 후 처음으로 시작해야하는 경우에는 작동하지 않습니다. 그러나 당신은 systemctl restart autossh@{1..2}(대신 N 대신 2) 사용할 수 있습니다. 이것은 덜 일반적이지만 프로세스가 시작되면 프로세스를 시작합니다 inactive (dead).
giorgiosironi

7

좋지는 않지만 이전 시스템을 사용하는 시스템에서 작동합니다.

systemctl list-units -t service --full| cut -d' ' -f1| grep mypattern | while read s; do systemctl restart $s; done

물론 위의 답변 ( systemctl restart 'autossh@*') 의 해결책 이 더 좋습니다.


주의 : cutlist-units 출력에 서비스가 실패한 경우 잘못된 필드를 구문 분석 할 수 있습니다.
Juuso Ohtonen

5

@weirdan 정답은 맞지만 특정 배포판에 대한 내용이 없습니다.

들어 CentOS의 7과 유사한 , 당신은 할 수 있습니다 :

systemctl (start|stop|restart|status) my-service@*

그러나 "--all"플래그를 지정하면 (시작) 만 작동합니다.

systemctl (start) my-service@* --all

그렇지 않으면 서비스가 존재하지 않기 때문에 서비스를 찾을 수 없습니다. 이것은 시스템화 된 기능입니다.

를 들어 우분투 기반 시스템, 그렇지 않으면 아무것도하지 않습니다, 그것은 거의 같은 방식으로 작동하지만 차이점은 "--all"플래그가 systemctl 인수의 모든 지정해야한다.

systemctl (start|stop|restart|status) 'my-service@*' --all

2

터미널에 와일드 카드 옵션이 있는지 여부는 알 수 없습니다. 할 수있는 것은 시스템화 된 스크립트에 스크립트를 추가하는 것입니다.

% i는 내가 생각하는 트릭을 수행하지만 인스턴스화 된 서비스를 스크립팅하는 방식과 관련이 있습니다.

여기서 지정 자라고 하는 설명을 찾을 수 있습니다.

그것은 그것을 보여줍니다 :

%엔

전체 단위 이름

%피

인스턴스화 된 단위의 경우 이는 단위 이름의 "@"문자 앞의 문자열을 나타냅니다. 인스턴스화되지 않은 장치의 경우 유형 접미사가 제거 된 장치의 이름을 나타냅니다.

%나는

인스턴스화 된 단위 : "@"문자와 장치 이름의 접미사 사이에있는 문자열입니다.

귀하의 질문에 직접 대답하는 것이 아니라 달성하려는 것으로 생각합니다. 이 아이디어에 따라 솔루션을 찾을 수 있다고 생각되면 시스템 스크립트를 공유하십시오. 그래서 우리는 결국 예제를 통해 설명하고 최종 스크립트를 제공 할 수도 있습니다.

그런 식으로 솔루션에 도달하기 위해 자신의 스크립트를 편집하는 데 자신감이 있다면 여기 에 예제가 있습니다 (솔루션과 관련이 있는지 알지 못하므로 인용하지 않을 것입니다. m 제안)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.