사용자 정의 단위 파일을 생성하기 위한 올바른 경로인 /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 작성자의 게시물세 가지 종료 수준stop
systemd , 및 의 차이점에 대한 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
.