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

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

ただいまの
回答率

90.48%

  • Python

    8545questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Raspberry Pi

    846questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

  • sh

    288questions

    shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

  • cron

    173questions

    cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

  • シェルスクリプト

    101questions

cronで登録しているpythonのプログラムの結果がファイルにリダイレクトされない?

受付中

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 210

hello1

score 2

よろしくお願いします。
ラズパイで、電圧などのモニタリングを行いたいと思っているのですが、うまくいきません。

間違っている箇所がありましたら、ご指摘願います。

result.txt

年月日時分秒,電圧,電流,電力

といった形式で記録していきたいです。

V_A_W.py

#coding utf-8
import Rpi GPIO as GPIO
import time
import commands
#電圧測定部分の関数
def GetV():
    chek = commands.getoutput("i2cget -y 1 0x40 0x02 w")
    return (int(check[4:6],16)*256+int(check[2:4],16))*1.25/1000
#電流測定部分の関数
def GetA():
    chek = commands.getoutput("i2cget -y 1 0x40 0x04 w")
    if int(check[4:6],16)<128:
      return (int(check[4:6],16)*256+int(check[2:4],16))
    else:
      return (int(check[4:6],16)*256+int(check[2:4],16)-256*256)
check = commads.getoutput("i2cset -y 1 0x40 0x05 0x0a 0x00 i")
print str(GetV())+"_V,"+str(GetA())+"_mA,"+str(GetV()*GetA())+"_W"
exit


これを

python V_A_W.py

だと

○_V,○_A,○_W

と出ます。

echo $(date '+%F-%H-%M-%S'),$(python V_A_W.py)

と実行すると、うまく表示されます。

しかし、

cron

* * * * * for i in 'seq 0 5 59'; do (sleep ${i}; echo $(date '+¥%F-¥%H-¥%M-¥%S'),$(python V_A_W.py) >> result.txt)& done;

と登録すると、

result.txt

年月日時分秒,

しか記録されません。

原因は何でしょうか?

また、

V_A_W.py

#coding utf-8
import Rpi GPIO as GPIO
import time
import commands

print "Hello"

にした場合だと、

年月日時分秒,Hello

になります。

# /bin/bash
echo $(date '+¥%F-¥%H-¥%M-¥%S'),$(python V_A_W.py)

という

hoge.sh

を作成し、

* * * * * for i in 'seq 0 5 59'; do (sleep ${i}; sh /home/pi/hoge.sh >> result.txt)

としても

年月日時分秒,

しか記録されませんでした。

知りたいこと

pythonのプログラム、
cronの設定の仕方、
シェルスクリプト、
どこに問題がありそうですか?
また、
どうやれば解決できるでしょうか?
何卒ご教授いただけましたら幸いです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

0

よくある間違いパターンはパイソンかパイソンのスクリプトがcronから起動されるプロセスのサーチパスにないというものです。いちど両方をフルパスで書いてみては?

cronのログファイルを見たらエラーメッセージが残っていませんか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

cron で実行する場合、PATHなどの環境変数が定義されていません。
つまり、pythonへのパスが不明であるため、pythonスクリプトが実行できていないものと推測されます。
書き込み先のファイルも、フルパスで記載するのがcronの慣例です。

また、cronではBashが動いているわけではないため、for文、$() のコマンド展開も無効です。
LinuxならBashとのことです。
再訂正、ディストリビューションに依存するようです。

やるとしたら、全部をbashスクリプトにまとめ、そのスクリプトをcronから叩くだけにする、というのがよさそうです。

monitoring.sh

#!/bin/bash
for i in 'seq 0 5 59'
do
    (sleep 5; echo $(date '+¥%F-¥%H-¥%M-¥%S'),$(/usr/bin/python /home/hogehoge/V_A_W.py) >> /home/hogehoge/result.txt)&
done
crontab

* * * * * /bin/bash /home/hogehoge/monitoring.sh

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/19 16:23

    /bin/shがbashであるLinuxだと、crontabのコマンド部分はbashで処理されますよ。
    そうでなくとも、/bin/shが処理するので、forでもリダイレクトでも書けます。

    キャンセル

  • 2018/06/19 16:32

    これは浅学でした。訂正します。

    キャンセル

  • 2018/06/19 16:53

    /bin/shがbashでないLinuxもあるかも知れません。

    キャンセル

  • 2018/06/20 11:43

    昔入れたラズベリーpiのdebian系OS raspbianの/bin/shが dashではまった事がありました(その時、始めてdashの存在を知りました)最近のubuntuも/bin/sh --> dash のようです。

    キャンセル

  • 2018/06/20 12:34

    otnさん、dodox86さん
    ディストリビューションに依存する、ということになりますでしょうかね。
    SHELL環境変数を明示すればそれが使われる、という記載も見ました。

    キャンセル

0

cronで上手く行かない場合は、エラーになっている可能性が高いので、エラーメールを見てください。
crontabの持ち主に対して、メールが届いているはずです。

* * * * * for i in 'seq 0 5 59'; do (sleep ${i}; echo $(date '+¥%F-¥%H-¥%M-¥%S'),$(python V_A_W.py) >> result.txt)& done; 

seq 0 5 59を囲うのは、クォートじゃなくてバッククオートです。
V_A_W.pyは、このユーザーのホームディレクトリにありますか?無ければフルパスで書いてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

pythonスクリプトから実行しているi2cget,i2cset、これはおそらく /usr/sbin に配置されてるはずですが、cronジョブではPATHが通っていない状況になっていると思います。
※pythonスクリプト自身がちゃんとホームディレクトリにあるか、質問から明確には読み取れませんが、そこは問題ないものという前提です

ということで、手っ取り早くは、pythonスクリプト内のi2cget,i2csetをフルパスで記述し直せば良いと思います。

crontabやシェルスクリプトとしては…。…。取り敢えずは動いてるから、まあ良いのかな、とも思いますが。

ただ、5秒おきに情報を書き出したいという目的ならば、分単位でしか制御できないcronに頼らずとも、5秒おきに処理を行う常駐pythonプロセスを1つ立てた方が素直じゃないかな、と思います。
sleepにせよ、時刻の整形にせよ、python単独でできるはずですから。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

同じタグがついた質問を見る

  • Python

    8545questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Raspberry Pi

    846questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

  • sh

    288questions

    shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

  • cron

    173questions

    cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

  • シェルスクリプト

    101questions