상태에 신경 쓰지 않는 "멍청한" 시스템 유닛을 생성하세요

상태에 신경 쓰지 않는 "멍청한" 시스템 유닛을 생성하세요

부팅 중에 시작되고 종료 중에 정상적으로 종료되는 애플리케이션이 있습니다. 문제는 systemd를 사용하여 응용 프로그램을 시작/중지할 수 없다는 것입니다. 때로는 수동 명령을 사용하여 "부분적으로" 시작해야 할 수도 있는 상당히 복잡한 응용 프로그램이므로 systemd에는 실제로 추적할 수 있는 좋은 방법이 없습니다. 애플리케이션의 실제 상태.

그래서 나는 서비스 상태에 관계없이 시작 시 특정 스크립트를 실행하고 종료 시 다른 스크립트를 항상 실행하는 "멍청한" 시스템 장치가 필요하다는 결론에 도달했습니다. 이것이 제가 성취하기 힘든 일입니다. 테스트에 사용한 것은 다음과 같습니다.

[Unit]
Description=My Test application
Wants=network-online.target 
After=network-online.target

[Service]
Type=oneshot
ExecStart=/home/user/tmp/systemd-test/script.sh start
ExecStop=/home/user/tmp/systemd-test/script.sh stop
RemainAfterExit=true

[Install]
WantedBy=multi-user.target

위의 문제는 start가 이전에 실행되지 않은 경우 "stop"을 실행할 수 없으며 그 반대의 경우도 마찬가지라는 것입니다.

$ systemctl start test  # Start script is run
$ systemctl start test  # Nothing happens
$ systemctl stop test   # Stop script is run
$ systemctl stop test   # Nothing happens
$ systemctl stop test   # Nothing happens

따라서 시작하는 동안 어떤 이유로 시작 스크립트가 실패하고 애플리케이션 관리자가 수동으로 시작한다고 상상해 보십시오. 그런 다음 systemd에 관한 한 제대로 시작되지 않았기 때문에 종료 중에 중지 스크립트가 실행되지 않습니다.

그래서 내 질문은 상태에 신경 쓰지 않는 "멍청한" 시스템 서비스를 만드는 방법이 있습니까, 아니면 이를 두 개의 다른 단위로 분할해야 합니까?

편집: 예상대로 systemd를 사용할 수 없는 이유를 자세히 설명하기 위해 상태: 응용 프로그램을 먼저 시작하려면 "서버" 프로세스를 시작해야 합니다. 일단 실행되면 "실행기" 프로세스가 시작되어 약 20개의 다른 프로세스가 시작됩니다. 처리 유형은 서로 다른 프로세스를 사용합니다. 그리고 모든 것이 비동기식으로 시작됩니다(즉, 비차단). 로그를 grep하거나 사용자 정의 바이너리를 호출하여 프로세스를 나열하는 것 외에는 실제로 언제 시작되는지 알 수 있는 방법이 없습니다. 따라서 systemd에서는 이러한 20개 프로세스 중 하나가 시작에 실패했는지 확인할 방법이 없습니다.

답변1

그래서 내 질문은 상태에 신경 쓰지 않는 "멍청한" 시스템 서비스를 만드는 방법이 있느냐는 것입니다.

당신은 시도 할 수 있습니다이것(실행 파일 앞의 대시에 유의하세요):

ExecStart=-/home/user/tmp/systemd-test/script.sh start

또는

응용 프로그램 관리자가 들어가서 수동으로 시작합니다.

환경 확인과 같이 systemd를 통해 스크립트를 구체적으로 실행하도록 할 수 있습니다.바꾸다:

test -z "$INVOCATION_ID" && echo "This script must be run via systemd" && exit

관련 정보