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

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

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

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

Raspberry Pi

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

Python

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

Q&A

0回答

1539閲覧

RaspberryPi & Python & cronでsubprocessの内容を定期的に取得したい

Zen_then

総合スコア34

cron

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

Raspberry Pi

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

Python

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

0グッド

0クリップ

投稿2021/10/25 14:32

編集2021/10/25 14:33

前提・実現したいこと

 Raspberry Pi Zero WHで、現在接続しているWiFiのSSIDと現在時刻を定期的にLCDに出力するプログラムを作成しています。
Pythonでコードを作成し、cronを使用して1分おきに処理(情報取得~LCD描画)を実行したいです。

発生している問題

RaspberryPi

1$ python3 lcd.py

LCD

1SSID: aterm-xxxxxxx 22021年10月25日 23:00

このコマンドで実行した場合は期待通りの動作をしてくれます。
しかし、cronで実行した場合、エラーにはなりませんがSSIDが取得できずに何も表示されません。

cron

1* * * * * python3 /home/pi/py/lcd.py

LCD

1SSID: 22021年10月25日 23:00

該当のソースコード

lcd.pyの内容は以下の通りです。

Python

1# -*- coding: utf-8 -*- 2import subprocess 3import board 4from PIL import Image, ImageDraw, ImageFont 5import adafruit_ssd1306 6import datetime 7 8i2c = board.I2C() 9oled = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c, addr=0x3c) 10 11# 現在日時取得 12dt_now = datetime.datetime.now( 13 datetime.timezone(datetime.timedelta(hours=9))) 14dispDatetime = dt_now.strftime('%Y年%m月%d日 %H:%M') 15 16# SSID取得 17cmd = 'iwconfig wlan0|grep ESSID' 18r = subprocess.Popen( 19 cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 20(stdout, stderr) = r.communicate() 21resStr = stdout.decode().rstrip() 22idx = resStr.find('ESSID:') 23dispSSID = resStr[idx + 7:-1] 24 25# Clear display. 26oled.fill(0) 27oled.show() 28 29# Create blank image for drawing. 30image = Image.new("1", (oled.width, oled.height)) 31draw = ImageDraw.Draw(image) 32 33font = ImageFont.truetype( 34 "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc", 12) 35font2 = ImageFont.truetype( 36 "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc", 12) 37 38# Draw the text 39draw.text((0, 0), "SSID: " + dispSSID, font=font, fill=255) 40draw.text((0, 18), dispDatetime, font=font2, fill=255) 41 42# Display image 43oled.image(image) 44oled.show() 45

試したこと

原因は何となくわかっていて、cronで実行した場合、iwconfigの標準出力が得られずにSSIDが空欄になってしまうことが原因だと思っています。
そこで以下のようなコマンドに変更してファイルから情報取得しようと思案し実行しましたが、cronによる起動で実行した場合は、やはりファイルに何も出力されません。

iwconfig wlan0|grep ESSID > /home/pi/py/iwconfig_dest.txt

このような場合、代替案が思いつかずアドバイスを頂戴したく存じます。

補足情報(FW/ツールのバージョンなど)

OSはRaspberry Pi OS Liteです。

シェル等の使用も検討してはいますが、シェルそのものにあまり知見がありません。
Pythonだけでどうにかしてしまうほうが作りはシンプルかなと思い暫く突き進んできたのですが、単純に私の知識が無いだけなのか、そういうものだと割り切って、さっさとシェル等の別モノに手を出すべきか躊躇しているところです。
情報の不足ございましたらお申し付けください。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問