前提・実現したいこと
Linux上でOoklaのSpeedtest cli
を実行して実行結果をCSVに書き込むシェルスクリプトを自作して、systemd
でデーモンとして実行したところエラーとなりました。
ExecStart
に記述したシェルスクリプトは単体だと問題なく実行でき、systemd
から実行したときのみエラーになります。
発生している問題・エラーメッセージ
Aug 20 08:42:25 raspberrypi speedtest[25916]: terminate called after throwing an instance of 'std::logic_error' Aug 20 08:42:25 raspberrypi speedtest[25916]: what(): basic_string::_M_construct null not valid
該当のソースコード
ユニットファイル(speedtest.service
)
bash
1[Unit] 2Description=Run Speedtest 3Requires=network.target 4 5[Service] 6ExecStart=/opt/speedtest.sh 7Type=simple
実行ファイル(speedtest.sh
)
bash
1#!/bin/bash 2 3NOW=$(date '+%H') 4RS=$(/usr/bin/speedtest -f csv) 5echo "${NOW},${RS}" >> /opt/speed.csv
試したこと
権限やパスは何回か見直したので問題ないと思います。
speedtest
を単体でsystemd
からキックした時も同じエラーとなったので負荷軽減のためにフォアグラウンドじゃないと実行できない制限でもかかっているのでしょうか。
エラーをググったところc++
関係でNULL
を渡したとき云々が書かれていましたがc++
は門外漢なのでちょっとよくわからなかったです。
よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
# uname -a Linux raspberrypi 5.4.58-v8+ #1335 SMP PREEMPT Thu Aug 13 22:29:57 BST 2020 aarch64 GNU/Linux # speedtest -V Speedtest by Ookla 1.0.0.2 (5ae238b) Linux/arm-linux-musleabihf 5.4.58-v8+ arm/aarch64
追記
速度計測自体は既にcron
を用いて実装済みです。
あえてデーモンとして実装したい理由は、一定時間内のランダムなタイミングで実行するためにRandomizedDelaySecを利用してみたいからです。
現時点ではcron
とランダム関数、sleep
を組み合わせて分散させていますが、sleep
を多用するのが(プロセスが発生するのでスマートではない気がして)好みではありません。
エラーの原因や解決法についてご教授頂けると幸いです。
よろしくお願いいたします。