부팅 중에 시작되고 종료 중에 정상적으로 종료되는 애플리케이션이 있습니다. 문제는 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