systemd가 서비스를 시작한 후 즉시 중지하는 이유는 무엇입니까?

systemd가 서비스를 시작한 후 즉시 중지하는 이유는 무엇입니까?

시스템 수준에서 사용자 지정 서비스를 구축하려고 합니다. 터미널에서 직접 실행할 때 성공적으로 실행되는 스크립트가 있습니다. 이 스크립트는 특정콘다그런 다음 CLI를 사용하여 웹 애플리케이션의 로컬 인스턴스를 시작합니다.

문제... 서비스를 시작하면 Conda 환경이 활성화되고 CLI를 호출하여 애플리케이션이 시작됩니다. 애플리케이션이 완전히 시작된 후 30초 이내에 중지됩니다. 저는 Simple Type 서비스를 사용하고 있습니다. 내가 읽은 바에 따르면 서비스가 시작되어 계속 실행되고 Control+를 누르 C 거나 서비스를 중지할 때까지 프롬프트를 반환하지 않는 경우 이 유형을 사용해야 합니다 .

journalctl -u my_service.service애플리케이션의 로그(데이터베이스에서 데이터 가져오기, 데이터베이스 시작 및 실행 중인 포트)를 표시한 다음 종료 로그를 푸시합니다(애플리케이션 중지...).

이것은 내 서비스입니다.

[Unit]
Description=Testing
After=network.target

[Service]
Type=simple
ExecStart=/path/to/insightd.sh start
ExecStop=/path/to/insightd.sh stop
ExecReload=/path/to/insightd.sh restart
WorkingDirectory=/path/to/working-dir
Restart=on-failure

[Install]
WantedBy=multi-user.target

답변1

이전 system-v 스타일 init 스크립트인 경우 /path/tp/insightd.sh백그라운드에서 명령을 시작할 수 있습니다. 시스템적인 관점에서 볼 Type=simple때 이는 서비스가 시작된 후 즉시 종료된 것처럼 보입니다.

의 경우 Type=simplesystemd는 에 의해 시작된 프로세스가 ExecStart포그라운드에서 계속 실행될 것으로 예상합니다.

이 문제를 해결하는 방법에는 두 가지가 있습니다.

  1. 사용하지 말고 대신 /path/to/insightd.sh스크립트를 확인하고 필요한 명령을 추출하여 포그라운드에서 서비스를 시작하세요.

  2. 로 변경 . 에서Type=simpleType-forking문서:

    로 설정하면 forking구성된 프로세스가 시작의 일부로 호출될 ExecStart=것으로 예상됩니다. fork()시작이 완료되고 모든 통신 채널이 설정되면 상위 프로세스가 종료될 것으로 예상됩니다. 하위 프로세스는 계속해서 기본 서비스 프로세스로 실행되며, 상위 프로세스가 종료되면 서비스 관리자는 해당 유닛이 시작된 것으로 간주합니다. 이는 기존 UNIX 서비스의 동작입니다. 이 설정을 사용하는 경우 PIDFile=systemd가 서비스의 기본 프로세스를 안정적으로 식별할 수 있도록 이 옵션도 사용하는 것이 좋습니다 . 상위 프로세스가 종료되면 systemd는 계속해서 후속 유닛을 시작합니다.

관련 정보