디렉토리에 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로 설정하면 안 됩니다.실제로 작동합니다일반적으로 시작 프로세스 초기와 종료 프로세스 후반에 대부분의 상황에서는 그렇지 않습니다. 기본 서비스 단위 종속성적절하다이 데몬의 경우.