Systemd가 내 vetcore 서비스를 종료했습니다: "성공적으로 비활성화되었습니다."

Systemd가 내 vetcore 서비스를 종료했습니다: "성공적으로 비활성화되었습니다."

그래서 Linux에서 netcore bash 스크립트용 systemd 파일을 만들었습니다. 하지만 서비스 파일을 시작하고 systemd계속해서 종료하면 "서비스: 비활성화됨"이라는 결과가 나타납니다.

삽입을 시도했지만 Type=forkingType=oneshot다 작동하지 않았습니다. 어떻게 해야 합니까?

서비스 파일은 다음과 같습니다.

[Unit]
Description=Example .NET Web API App running on Ubuntu

[Service]
Type=oneshot
ExecStart=/usr/bin/updatem
User=root

[Install]
WantedBy=multi-user.target

결과는 다음과 같습니다.

10:57 AM    kill UpdateM
10:57 AM    starting UpdateM
10:57 AM    3
10:57 AM    2
10:57 AM    1
10:57 AM    UpdateM (v.1.0.0.12)
10:57 AM    UpdateM (v.1.0.0.12) UP.
10:57 AM    Start
10:57 AM    updatem.service: Deactivated successfully.
10:57 AM    Finished Example .NET Web API App running on Ubuntu.

답변1

를 사용할 때 Type=oneshot일반적으로 해당 라인에서 호출된 프로세스가 종료된 후 RemainAfterExit=yes시스템에서 ExecStart=서비스가 "실행 중"으로 간주되도록 하려고 합니다.

약 :man systemd.serviceType=oneshot

서비스 없이 이 옵션을 사용하는 경우 RemainAfterExit=서비스는 "활성" 장치 상태로 전환되지 않고 구성이 없기 때문에 "활성화"에서 "비활성화" 또는 "비활성"으로 직접 전환됩니다. 지속적으로 실행해야 하는 프로세스 . 특히 이는 이러한 유형의 서비스가 실행된 후( RemainAfterExit=아직 설정되지 않은 경우) 이후에 시작된 것으로 나타나지 않고 오히려 죽은 것으로 나타남을 의미합니다.

따라서 표시되는 동작은 Type=oneshot+ no 를 사용하여 예상한 것과 정확히 같습니다 RemainAfterExit=yes.

/usr/bin/updatem스크립트가 실제로 계속 실행되어야 하는 하위 프로세스를 생성하는 경우 Type=forking서비스 유형 선택이 올바른 것입니다.

그러나 /usr/bin/updatem스크립트가 단순히 이미 존재하는 다른 프로세스에 명령을 보내는 경우에는 다음과 같은 결과가 발생합니다.그것다른 것을 시작하고 명령이 전송되자마자 스크립트와 모든 직계 자손이 사라지면 Type=oneshot아마도 가 RemainAfterExit=yes올바른 선택일 것입니다.

그런 다음 필요한 경우 ExecStop=이 스크립트에 의해 시작된 작업을 중지하기 위해 다른 명령을 보내는 다른 스크립트를 가리키는 줄을 추가할 수도 있습니다. /usr/bin/updatem이는 또한 systemctl stop UpdateM.service의미 있는 작업이 될 수 있으며 시스템이 종료될 때(아직 실행 중인 경우) systemd가 작업을 더 우아하게 중지할 수 있게 해줍니다.

서비스 파일을 사용하지 않고 수정하는 경우 서비스 파일 변경 사항을 적용하려면 systemctl edit실행해야 한다는 점을 기억하세요 .systemctl daemon-reload

관련 정보