Yocto Linux 서비스 스크립트 문제

Yocto Linux 서비스 스크립트 문제

디렉토리에 mqtt.service있는 시스템 스크립트를 작성했습니다./home/root

이것은 내 mqtt.service스크립트입니다.

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
[Unit]
Description=mqtt

DefaultDependencies=no
After=xdk-daemon.service


[Service]

Restart=always
RestartSec=10
ExecStart=/bin/sh /home/root/mosquitto-1.4/mqtt_start.sh



[Install]

WantedBy=multi-user.target

이것이 내용이다mqtt_start.sh

#!/bin/sh
/home/root/mosquitto-1.4/src/mosquitto -c /home/root/mosquitto-1.4/mosquitto.conf -d -p 1885 > /dev/null 2>&1

이 줄을 붙여넣으면:

/home/root/mosquitto-1.4/src/mosquitto -c /home/root/mosquitto-1.4/mosquitto.conf -d -p 1885

터미널로 이동하면 mqtt 브로커가 정상적으로 시작되지만 여기서는 시작할 수 없습니다.

내가 해냈어

$ systemctl enable /home/root/mqtt.service
$ systemctl status mqtt.service
● mqtt.service - mqtt
   Loaded: loaded (/home/root/mqtt.service; enabled)
   Active: failed (Result: resources) since Mon 2015-04-06 10:42:48 UTC; 24s ago
 Main PID: 677 (code=exited, status=0/SUCCESS)

Apr 06 10:42:39 edison sh[677]: 1428316959: Warning: Mosquitto should not be run as root/administrator.
Apr 06 10:42:48 edison systemd[1]: mqtt.service holdoff time over, scheduling restart.
Apr 06 10:42:48 edison systemd[1]: mqtt.service failed to schedule restart job: Unit mqtt.service failed to load: No such file or directory.
Apr 06 10:42:48 edison systemd[1]: Unit mqtt.service entered failed state.

내가 어디에서 잘못되었는지 알려주세요.

편집하다:

다시 시작한 후 나는 다음을 수행했습니다.

systemctl 상태 mqtt.service결과는 다음과 같습니다.

● mqtt.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)

답변1

시스템 서비스 단위의 기본값은 이지만 Type=simple래퍼 스크립트는 해당 --daemon옵션을 사용하고 있습니다. 이는 준비 프로토콜 불일치입니다. 준비 프로토콜 불일치로 인해 서비스가 올바르게 시작되지 않거나 (더 일반적으로) systemd에서 오류로 진단될 수 있습니다.

후자는 여기서 일어나고 있습니다. 시스템을 과도하게 엔지니어링했기 때문에 데몬이 불필요하게 분기되었습니다.두 번 이상, 잘못된 프로세스는 실제 데몬 프로세스입니다. 또한 래퍼 스크립트에서 systemd 서비스 단위 기능을 불필요하게 복제하고 있습니다.

래퍼 셸 스크립트를 완전히 제거하고 다음과 같이 서비스 단위를 작성하세요.

[단위]
설명=모스키토 MQTT 브로커
문서=man:mosquitto(8)
문서=man:mosquitto.conf(5)
ConditionPathExists=/home/root/mosquitto-1.4/mosquitto.conf
이후=xdk-daemon.service

[제공하다]
ExecStart=/home/root/mosquitto-1.4/src/mosquitto -p 1885 -c /home/root/mosquitto-1.4/mosquitto.conf
ExecReload=/bin/kill -HUP $MAINPID
사용자=모기
다시 시작 = 실패 시
재부팅 초 = 10

[설치하다]
WantedBy=다중 사용자.대상

참고:

  • 이 옵션은 필요하지 않습니다 --daemon. 브로커데몬화되었습니다systemd가 실행할 때.
  • 이 옵션을 사용하면 안 됩니다 --daemon. Mosquitto는 forking준비 프로토콜 에 대해 이야기하지 않습니다 .사실 아직 준비가 안 됐어요분기 후 종료합니다. (언젠가는 사람들이 이와 같은 프로그램을 작성하여청취 소켓을 상속받습니다.따라서 소켓을 통해 활성화될 수 있습니다. )
  • 래퍼 스크립트에서 stdout 및 오류를 조작할 필요가 없습니다. systemd는 데몬의 표준 출력과 오류를 처리합니다. 꼭 필요한 경우 서비스 단위 파일에서 구성할 수 있지만 이 프로그램에서는 전혀 필요하지 않은 것 같습니다.
  • systemd가 인식하는 올바른 프로세스는 이제 데몬이므로 systemctl reload mqtt.service이제 올바른 위치와 작업으로 신호를 보낼 수 있습니다.
  • systemd 자체는 사용자로 프록시를 호출하므로 mosquitto해당 이름을 가진 사용자 계정이 존재하고 필요한 액세스 권한이 있는지 확인해야 합니다. 로그의 경고를 참고하세요.
  • on-failure재시작 전략으로 systemd 사람들이 권장합니다 always.
  • DefaultDependencies데몬 프로세스가 아닌 이상 false로 설정하면 안 됩니다.실제로 작동합니다일반적으로 시작 프로세스 초기와 종료 프로세스 후반에 대부분의 상황에서는 그렇지 않습니다. 기본 서비스 단위 종속성적절하다이 데몬의 경우.

관련 정보