
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