확신하는.

확신하는.

내 프로그램 "abc"를 시작/중지하는 두 가지 메커니즘이 있습니다.

  1. /usr/lib/systemd/system/abc.service의 systemctl 서비스 파일
  2. /etc/abc init script abc 스크립트는 모든 데몬을 호출합니다. 하지만 /etc/abc를 사용하여 데몬을 시작/중지하면 systemctl 상태가 정확하지 않습니다.

이 문제를 해결하기 위해 Type=forking을 추가하고 PIDFile 지시어를 추가했습니다. 멈추는 문제를 해결했습니다. abc init 스크립트를 사용하여 데몬을 중지하면 systemctl 상태가 비활성으로 표시됩니다. 따라서 이 문제는 부분적으로 해결되었습니다. 그러나 abc init 스크립트를 사용하여 데몬을 시작하면 여전히 비활성 상태입니다.

이 문제를 어떻게 해결할 수 있나요? 파일이 존재하는지 확인한 다음 서비스에 알리는 abc.path 파일을 도입해 보았습니다. 그러나 이것은 도움이 되지 않습니다.

시스템 219를 사용하세요.

답변1

확신하는.

서비스 관리 하위 시스템에서 시작되지 않은 경우 서비스 관리 하위 시스템에서 추적되지 않습니다. 사실, 그들은 진정한 데몬이 되지는 않을 것입니다.

rcvan Smoorenburg 호환성 메커니즘에 대한 배경

추가 자료: https://unix.stackexchange.com/a/233581/5132

systemd에서 제공하는 van Smoorenburg 호환성 메커니즘은 rc다음과 같습니다.발전기. 그것은 다음이 있음을 보장합니다.생성됨 abc.service/etc/init.d/abc start서비스가 시작될 때와 서비스가 중지될 때 /etc/init.d/abc stop실행되는 서비스입니다 .

이 시점에서 이 존재하면 systemd의 생성기에 의해 생성되는 것이 완전히 방지됩니다 /usr/lib/systemd/system/abc.service.abc.service

rc이것은 바닐라 시스템에서 van Smoorenburg 호환성의 전체 범위입니다. 슈퍼유저 기능직접 전화하다 /etc/init.d/abc다양한 방법으로 systemd에 대한 연결을 제공합니다.바닐라 시스템의 향상으로운영 체제의 개별 개발자.

예를 들어 Debian과 Ubuntu의 사람들은 다음을 제공합니다.후크그들만의 /lib/lsb/init-functions.d/서브시스템그 동작은 다음과 같습니다:

  • 후크가 init.d스크립트가 생성된 systemd 서비스의 ExecStart/ExecStop으로 호출되고 있음을 감지하면 특별한 작업을 수행하지 않고 스크립트의 나머지 부분을 있는 그대로 실행합니다.
  • 후크가 init.d스크립트가 직접 호출되었음을 감지하면아니요생성된 systemd 서비스의 일부로 나머지 스크립트를 실행하지 않고 해당 서비스로 전환하고 전환합니다. (일부 동사를 전달하지만 아래 설명과 같이 처리되는 및 에 대해 이야기하고 있습니다.)/etc/init.d/name verbsystemctl verb namestartstop

호환성 메커니즘이 없는 경우

모든 운영 체제에 rc직접 호출을 systemd 작동 방식으로 변환하는 van Smoorenburg 호환성 메커니즘이 있는 것은 아닙니다. 일부 운영 체제(예: "/etc/init.d/name verbArch 설치 중에 `init 0`으로 인해 "초과 매개변수"가 나타나는 이유는 무엇입니까?rc", 예를 들어) van Smoorenburg 호환성을 제공하지 않습니다.별말씀을요, Debian/Ubuntu와 같은 후크를 제공하지 않으며 심지어 바닐라 시스템과 함께 제공되는 호환성 메커니즘을 완전히 비활성화합니다.

이러한 운영 체제에서 rcvan Smoorenburg 스크립트를 직접 실행하면 스크립트가 있는 그대로 실행됩니다.

그런 스크립트확실히서비스 관리 하에 서비스를 시작합니다. 이는 이중 포크와 같은 작업을 헛되이 수행하며 대부분의 경우 실제 서비스 데몬이 실행되는 동일한 환경에서 실행을 시도합니다. (소위 "데몬"이라고 불리는 것 중 상당수는 작동하지 않으며 1980년대 이후로는 작동하지 않았습니다. 이것이 90년대 초반에 적절한 데몬 관리 시스템이 발명된 이유입니다.) 그러나 서비스 관리에 관한 한, 상호작용 슈퍼유저는 로그인 세션에서 콘텐츠를 분기했습니다.

실제로 systemd는 직접적으로 호출되는 van Smoorenburg rc스크립트와 사용자 상호 작용의 일부로 실행하기 위해 백그라운드에 생성되는 모든 쓸데없는 "데몬" 프로그램을 고려합니다.세션 범위사용자 내에서조각, 사용자 세션이 끝날 때 실행되는 서비스가 아닌시스템 슬라이싱.

rc더 나쁜 것은 van Smoorenburg 시스템의 매우 결함이 있는 메커니즘을 사용하게 되었다는 것입니다 .서비스 이름과 일치하는 모든 프로세스를 종료합니다.대신 주유소에서오직서비스 관리자가 시작하여 추적 중인 특정 서비스 프로세스입니다. 그게 바로 그 이유야/etc/init.d/name stop나타나다당신을 위해 일하십시오. 스크립트는 이름과 일치하는 모든 프로세스를 종료하며, 여기에는 Service Manager에서 실행 중인 프로세스도 포함됩니다. 하지만 모든 것을 무차별적으로 죽이는 것은 버그이지 기능은 아닙니다. 이것은 단지모습적절한 기능을 갖추고 있으며~ 할 것이다지난 수십 년 동안 너무 많은 시스템 관리자를 물었던 것처럼 그것은 당신을 물릴 것입니다.

올바른 접근 방식

그러한 호환성 메커니즘이 부족한 경우rcvan Smoorenburg 스크립트를 직접 호출 하지 마세요.. 너무 간단합니다. serviceor 명령을 사용하여 systemctlsystemd의 서비스 관리와 통신하지만 서비스 상태를 중지, 시작 또는 가져오기 위해 직접 실행하지 마십시오./etc/init.d/anything

종속점은 바로 너다해서는 안 된다Van Smulenburg의 대본이 작동하도록 하기 위해 괴팍함이 /usr/lib/systemd/system/abc.service있었습니다 rc. Type=forking거의 확실히 틀렸어당신의 서비스에. (거의 모든 실제 서비스와 일치하지는 않습니다.) 이것을 제안한 사람이 누구든 /usr/lib/systemd/system/abc.service실제 서비스 관리에 전혀 필요하지 않은 악명 높은 손상된 PID 파일 메커니즘에서 벗어날 수 있다면 실현될 수 있을 것입니다. 그것을 다시 넣는 것은 어리석은 일입니다.

추가 읽기

관련 정보