그래서 Linux에서 netcore bash 스크립트용 systemd 파일을 만들었습니다. 하지만 서비스 파일을 시작하고 systemd
계속해서 종료하면 "서비스: 비활성화됨"이라는 결과가 나타납니다.
삽입을 시도했지만 Type=forking
둘 Type=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.service
Type=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