質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

systemd

systemdは、Linuxの起動処理及びシステム管理を行う技術です。他にも多くのサービス管理機能を備えており、ユーザープロセスを並列に起動しシステムの起動処理に要する時間を短縮できるなどの特徴があります。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

2回答

1671閲覧

systemdからOoklaのspeedtestが実行できない

退会済みユーザー

退会済みユーザー

総合スコア0

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

systemd

systemdは、Linuxの起動処理及びシステム管理を行う技術です。他にも多くのサービス管理機能を備えており、ユーザープロセスを並列に起動しシステムの起動処理に要する時間を短縮できるなどの特徴があります。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2020/08/20 00:12

編集2020/08/20 08:48

前提・実現したいこと

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を多用するのが(プロセスが発生するのでスマートではない気がして)好みではありません。

エラーの原因や解決法についてご教授頂けると幸いです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dameo

2020/08/21 08:11

speedtest.shをフルパスで記述してください。 speedtest.serviceをフルパスで記述してください。複数ある場合は複数記述してください。 全ファイルの所有者とパーミッションを記述してください。 好みとかそういう情報は要らないので、エラーが起きたときのコマンドや試したことを「正確に」記述してください。
guest

回答2

0

同じのエラーあった
speedtest required HOME environment path but systemd doesn't provide it.
So just add HOME into systemd serivce script, like this:

[Unit] Description=Run Speedtest Requires=network.target [Service] Environment=HOME=/ ExecStart=/opt/speedtest.sh Type=simple

Then the problem should be solved.

投稿2023/10/27 06:54

ember

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そもそもデーモンとして利用する類のものではない気がしますが、デーモンで利用したい要件は何なのでしょうか?
定期的(不定期でも)に速度計測したいならcronでするのが一般的かと思います。

投稿2020/08/20 04:52

yukky1201

総合スコア2751

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/08/20 08:39

ありがとうございます。 ご指摘の点、おっしゃる通りです。 実際、今のところcronで実装して問題なく稼働しております。 デーモンを利用する要件は特にありませんが、強いて言えばsystemdのtimerで定期実行するとRandomizedDelaySecオプションが利用できることでしょうか。 cronの実装ではシェルスクリプト側でランダムな時間のsleepを組み込んで同様の機能を実現していますが、sleepを使うのは待機中のsleepプロセスが発生して好みではありません。 要件はそれぐらいですが現時点でsystemdで実装したい理由としては、単に自分のスキルアップといいますか、エラーの原因が気になるというのが主です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問