Linux 시스템 내부의 SD 카드에 mqtt 데이터를 저장하기 위해 작은 bash 스크립트(datalogger.sh)를 작성했습니다. Bash 스크립트는 다음과 같습니다:-
#!/bin/bash
fileNumber=1
temp=1 // flag to check and create new files
fileName="Data"
while [ $temp -le 1 ]
do
if [ -f "/media/card/$fileName$fileNumber.txt" ]
then
((fileNumber++))
else
touch "/media/card/$fileName$fileNumber.txt"
mosquitto_sub -v -t "gateway/+/rx" | tee /media/card/$fileName$fileNumber.txt
temp=2
fi
done
다음 명령을 사용하여 bash 스크립트를 실행하면 제대로 작동합니다.
./datalogger.sh
다음 단계에서는 update-rc.d datalogger.sh defaults
시작 시 자동으로 실행되도록 bash 스크립트를 사용했습니다. 그러나 빈 텍스트 파일만 얻습니다. 누구든지 나를 안내해 줄 수 있습니까? 내가 어떤 실수를 저질렀습니까? 감사합니다,
답변1
시스템 시작 스크립트에서 시작되면 프로세스는 일반적으로 일반 사용자 세션에 비해 매우 제한된 환경 변수 세트를 가져옵니다.
mosquitto_sub
$XDG_CONFIG_HOME/mosquitto_sub
또는 에서 구성 파일을 읽어 보십시오 $HOME/.config/mosquitto_sub
. 시작 스크립트에서 시작할 때 $XDG_CONFIG_HOME
정의되지 않을 수도 있고 $HOME
존재하지 않을 수도 있습니다.
해당 $PATH
변수도 일반 사용자의 변수와 다를 수 있으므로 스크립트가 명령을 찾지 못할 수도 있습니다 mosquitto_sub
.
답변2
서비스는 일반적으로 다음과 같은 래퍼 스크립트를 사용합니다.
#!/bin/bash
# Provides: example
# Required-Start:
# Should-Start:
# Required-Stop:
# Default-Start: 2 3 5
# Default-Stop: 0 1 2 6
# Short-Description: example
# Description: example
#
# /etc/init.d/example
#
set -e
trap 'echo "ERROR: $BASH_SOURCE:$LINENO $BASH_COMMAND" >&2' ERR
NPID=$(pgrep -f example2.sh || true);
function start {
if [ "$NPID" = "" ] ; then
screen -S example -d -m bash -c '/root/example2.sh'
else
echo "example service is already running as $NPID";
fi
}
function stop {
if [ "$NPID" != "" ] ; then
kill "$NPID";
else
echo "example service was not running" >&2;
fi
}
function status {
if [ "$NPID" = "" ]; then
echo "example is not running";
else
echo "example is running with pid $NPID";
fi
}
if [ "$1" = "start" ]; then
start
elif [ "$1" = "stop" ]; then
stop
elif [ "$1" = "restart" ]; then
stop;
start;
elif [ "$1" = "status" ]; then
status
else
echo " * Usage: /etc/init.d/example {start|status|stop|restart}";
fi