/etc/systemd/system에 단위 파일이 있는 서비스를 어떻게 차단합니까?

/etc/systemd/system에 단위 파일이 있는 서비스를 어떻게 차단합니까?

사용자 정의 단위 파일을 생성하기 위한 올바른 경로인 /etc/systemd/system 아래에 테스트 서비스를 생성했습니다.

[root@apollo system]# cat sample.service
[Unit]
Description=This is my test service
Wants=chronyd.service
After=chronyd.service

[Service]
Type=forking
ExecStart=/root/sample.sh

[Install]
WantedBy=multiuser.target chronyd.service
#RequiredBy=multiuser.target chronyd.service
#Alias=xyz
[root@apollo system]# pwd
/etc/systemd/system
[root@apollo system]#

"systemctl daemon-reload"를 실행하여 systemd가 알고 있는지 확인했습니다. 서비스를 중지/시작할 수도 있습니다.

차단하려고 하면 다음 오류가 표시됩니다.

[root@apollo system]# systemctl mask sample.service
Failed to execute operation: File exists
[root@apollo system]#

이는 systemd가 다음을 사용하여 심볼릭 링크를 생성하려고 하기 때문입니다.

ln -s /dev/null /etc/systemd/system/sample.service

Sample.service가 /etc/systemd/system에 이미 존재하므로 systemd가 "ln -fs"를 사용하지 않으면 명령이 실패합니다.

이는 /etc/systemd/system? 아래에 생성된 유닛 파일을 차단할 수 없음을 의미합니다.

example.service를 /usr/lib/systemd/system으로 이동하려고 시도했는데 아무런 방해 없이 /etc/systemd/system 아래에 심볼릭 링크를 생성할 수 있었기 때문에 차단할 수 있었습니다.

누구든지 이것을 경험 했습니까? 이것이 버그라고 생각하시나요?

답변1

/etc/systemd/system먼저 서비스 파일을 삭제하지 않고는 서비스 파일이 포함된 서비스를 차단할 수 없습니다. 이는 의도적인 설계에 의한 것입니다.

할 수 있는 장애를 입히다대부분의 경우 해당 서비스를 사용하면 systemctl disable servicename.service해당 서비스를 차단하는 것과 동일한 효과가 있습니다.

systemd 작성자의 게시물세 가지 종료 수준stopsystemd , 및 의 차이점에 대한 disable자세한 내용 .mask

답변2

Mark Stolsburg가 승인한 답변은 완전히 정확하며 투표를 받게 되어 기쁩니다. 이는 의도적으로 불가능합니다. 하지만 본인의 서비스를 일시적으로 차단하는 것이 일생에 한 번 유용할 수 있다는 점에는 동의합니다. 예를 들어 디버깅할 때나 하드웨어가 일시적으로 제대로 작동하지 않을 때입니다.

하지만 그때부터끝없는 토론끝이 없습니다. 그렇게 할 수 없다면 그냥 가짜로 만드세요. 이름을 바꾸고 your.service시스템 에 공지 your.service.masked되도록 systemctl daemon-reload하세요. 유일한 단점은 서비스가 전혀 보고하지 않고 존재하지만 차단된다는 것입니다.

$ sudo mv -v /etc/systemd/system/dpkg-daily.service{,.masked}
renamed '/etc/systemd/system/dpkg-daily.service' -> '/etc/systemd/system/dpkg-daily.service.masked'
$ sudo systemctl daemon-reload
$ journalctl -n5
 . . .
Oct 06 18:31:16 [previous irrelevant message, logged 5.5 hours ago...
                 ... systemd itself is totally nonchalant about something ending in .masked ...]
Oct 06 23:53:57 buba systemd[1]: Reloading.
$ systemctl status dpkg-daily.service
Unit dpkg-daily.service could not be found. <== If you can live with that...

...그리고 실패한 종속성 - 그러나 그들은여전히 실패할 것이다어쨌든 장치가 덮여 있는 경우. 다른 장치의 종속성으로 시작되지 않는 한 서비스를 차단할 이유가 없습니다. 이 경우 허용되는 답변에서 제안한 대로 서비스를 비활성화하면 됩니다.

$ sudo mv -v /etc/systemd/system/dpkg-daily.service{.masked,}
renamed '/etc/systemd/system/dpkg-daily.service.masked' -> '/etc/systemd/system/dpkg-daily.service'
$ sudo systemctl daemon-reload
$ systemctl status dpkg-daily.service
● dpkg-daily.service - Daily dpkg database backup
     Loaded: loaded (/etc/systemd/system/dpkg-daily.service; static)
     Active: inactive (dead) since Fri 2023-10-06 00:00:07 PDT; 24h ago
TriggeredBy: 

답변3

경고하다:
설명에서 언급했듯이 /lib디렉터리를 변경하는 것은 권장되지 않습니다. 그러나 지역 문제를 다루고 있다면 이 솔루션을 고려해 볼 수 있습니다. 내 경우에는 누군가가 실수로 서비스를 실행하는 것을 원하지 않았기 때문에 이 접근 방식을 사용하여 아무 것도 깨지지 않았습니다.


이 서비스를 차단하기로 결정한 경우 장치의 구성 파일을 으로 이동해야 합니다 /lib/systemd/system.

sudo mv /etc/systemd/system/sample.service /lib/systemd/system/

그런 다음 다음을 실행할 수 있습니다.

sudo systemctl mask sample.service

그러면 에 심볼릭 링크가 생성됩니다 /etc/systemd/system/sample.service.

관련 정보