Systemd는 프로세스를 다시 생성하지 않습니다.

Systemd는 프로세스를 다시 생성하지 않습니다.

우리는 systemd에 의해 처리되는 영원히 실행되는 셸 스크립트를 가지고 있으며, 거대한 로그 파일로 인해 서버 저장소가 100% 사용된 며칠 전까지만 해도 잘 작동했습니다. 공간을 확보하려면 이 파일을 잘라야 합니다.

오늘 스크립트 실행이 중지되었다는 보고를 받았습니다. 하지만 상태를 확인해 보니 다음과 같습니다.

● ImportantService.service - Important daemon
   Loaded: loaded (/etc/systemd/system/ImportantService.service; enabled; vendor preset: disabled)
   Active: active (exited) since Wed 2020-04-29 16:46:48 WIB; 5 days ago
  Process: 48877 ExecStop=/usr/local/bin/importantScript stop --instance XYZ (code=exited, status=0/SUCCESS)
  Process: 48889 ExecStart=/usr/local/bin/importantScript start --instance XYZ (code=exited, status=0/SUCCESS)
 Main PID: 48889 (code=exited, status=0/SUCCESS)
    Tasks: 0
   Memory: 48.0K
   CGroup: /system.slice/ImportantService.service

작업이 0개 있는 것을 확인하여 수동으로 다시 시작했습니다. 지금은 정상적으로 실행되고 있습니다. 앞서 언급한 문제로 인해 발생한 것으로 의심됩니다.

문제는 앞으로 그러한 문제가 발생하면 systemd가 프로세스를 재생성하도록 하는 방법입니다.


.service 파일은 다음과 같습니다.

[Unit]
Description= Important daemon

[Service]
Type=oneshot
ExecStart=/usr/local/bin/importantScript start --instance XYZ
RemainAfterExit=true
ExecStop=/usr/local/bin/importantScript stop --instance XYZ

[Install]
WantedBy=multi-user.target

고쳐 쓰다:내 스크립트에 대한 설명

의 주요 기능은 ImportantScript주어진 (arg) 디렉터리에서 특정 이벤트가 발생하는 경우 특정 작업을 수행하기 위해 무한 루프를 입력하는 것입니다. 다양한 디렉터리에 대해 여러 인스턴스를 시작할 수 있어야 합니다. 스크립트를 시작하기 전에 다음과 같은 인스턴스 사양 세트를 추가해야 합니다.

ImportantScript add --name XYZ --dir /path/to/dir ..etc..

이제 시작할 수 있습니다 XYZ.

인스턴스를 시작할 때마다 사전 정의된 모든 인스턴스가 포함된 파일에 PID를 저장합니다(이전 add명령 사용). 나열되지 않은 PID는 해당 인스턴스가 유휴 상태임을 나타냅니다.

인스턴스를 중지하려면 을 호출하면 됩니다 ImportantScript stop --instance name. 그러면 프로세스가 종료되고 파일에서 해당 항목이 삭제되어 혼란스러운 부분이 정리됩니다.

이것이 시스템화된 공포의 집 항목이 아니기를 바랍니다.

답변1

systemd가 서비스를 다시 시작하도록 하려면 Restart=서비스 옵션이 필요합니다. Active: active (exited)systemctl 출력에 표시된 것처럼 서비스가 자체적으로 종료되었을 수 있으며 종료 코드는 0입니다.

가장 일반적으로 가능한 구성 중 일부는 다음 항목에 설명되어 있습니다.man systemd.service, 예:

  • Restart=always: 명시적으로 중지되지 않은 경우(예 systemctl stop: DBus를 통해 직접 호출된 경우 ) StopUnit서비스를 다시 시작합니다 .
  • Restart=on-failure: 서비스가 >0 종료 코드로 종료된 경우 다시 시작하세요.
  • Restart=no:기본. 서비스를 다시 시작하지 마십시오.

이는 아마도 가장 일반적으로 사용되는 설정일 것입니다. 위에 링크된 표에서 더 많은 옵션을 찾을 수 있습니다.

관련 정보