🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
systemd

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

Raspberry Pi

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

Python

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

Q&A

解決済

1回答

1066閲覧

ラズベリーパイにて、systemdで自動起動した場合に、ファイルメイクした.txtファイルが表示されない(ただし存在はしている)

shinchoroX

総合スコア18

systemd

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

Raspberry Pi

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

Python

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

0グッド

0クリップ

投稿2020/12/03 01:04

編集2020/12/03 01:41

前提

ラズベリーパイ4にて、Pytohn3にでプログラムを作成しています。
一日に一回、本日の日付のテキストファイルを作成し、メールで送信します。
(朝にテキストファイル作成し、夜にメール送信)

手動(Thonnyからの実行ボタン、ターミナルからのコマンドでの実行)で作成後、動作を確認しています。
その後、systemd利用して、電源ON後に自動でプログラムが走るようになっています。

動作は全てOKなのですが、以下の問題点があります。

発生している問題

「自動起動時にGUI環境下で、フォルダを見た時に作成したテキストファイルが表示されない」
という現象が発生しています。(ターミナルでlsを打っても表示されません)

しかし、「ファイルは表示されないが、メールに添付して送信は出来ている」状態です。
上記の「手動」で実行するとキチンとテキストファイルが作成されます。
自動起動の場合のみ、ファイルが表示されません。

メール送信やファイル作成の時間設定を変更し、
1.ラズパイ起動->1分後にプログラム自動起動
2.この時にイニシャル処理で作成されているはずのテキストファイルが無い
2.5分後にメール送信完了(ファイルが無いとエラーで止まるはず+実際にメール受信している)
となっているので、動作は問題ありません。

が、ラズパイ上でファイルの内容が確認できないので不便です。

該当のソースコード

以下をモジュール化してメイン関数内にて使用しています。

以下の2パターンでテキストファイルを作成しています。
1.プログラム実行時のイニシャル設定時
2.一日に一回の指定時間時に
両方のパターンで問題が発生しています。

Pyton3

1# coding: UTF-8 2 3''' 4ファイル書き出し用のモジュール 5タイムスタンプ名のファイルを書き出す 6流れは 71.ファイル作成(適当な名称) 82.osモジュールの機能でリネーム 9''' 10 11import time 12import datetime 13import os 14 15''' 関数定義 ''' 16 17''' ######################### 18関数名:fmake_txtemp 19引数 :作成したいファイルのパス 20戻り値:なし 21機能 :空のtxtファイルを作成 22######################### ''' 23 24def fmake_txtemp(path): 25 with open(path,mode='w') as f: 26 f.write('') 27 28''' ######################### 29関数名:fmake_TimeStmp 30引数 :変更したいファイルパス 31戻り値:なし 32機能 :今日の日付が名称のtxtファイルを作成 33    リネーム機能を使っているので、先にファイルを作成しておく必要がある 34    形式はyyyymmdd.txt 35######################### ''' 36def fmake_TimeStmp(path): 37 now = datetime.datetime.now() 38 new = '{0:%Y%m%d}.txt'.format(now) 39 os.rename(path,new)

メインプログラム内で

#初期設定等 """ データ書き出し用ファイルの作成 """ Filepath = './init.txt' FW.fmake_txtemp(Filepath) FW.fmake_TimeStmp(Filepath) #メインループで while (True): # 00:01 FW.fmake_txtemp(Filepath) FW.fmake_TimeStmp(Filepath) # 23:59 メール送信

試したこと

ファイル作成時間、メール送信時間を調整し、上述の通り
「ファイルは表示されないが、メールに添付して送信は出来ている」
ことを確認しています。

*** ls -a の結果

pi@raspberrypi:/Leasemat $ ls -a
. File_w_time.pyc SendMailATT.pyc save_ONpic
.. JudgeTime.py pycache send_email.py
CC.py JudgeTime.pyc modules send_email.pyc
Camera_Count.py MotionSensor.py rec_movie.py
Camera_Count.pyc MotionSensor.pyc rec_movie.pyc
File_w_time.py SendMailATT.py save_CNTpic
pi@raspberrypi:
/Leasemat $

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

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

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

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

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

coco_bauer

2020/12/03 01:31

コンソールでinit.txtを生成したディレクトリに移ってから、"ls -a"コマンドを実行した結果を質問に追加してもらえませんか。 そこに、init.txtからリネームされた.txtファイルが含まれているのではないかと思うのですが。
shinchoroX

2020/12/03 01:42

アドバイスありがとうございます。 追記しました。 日付のファイルは無いようです。
shinchoroX

2020/12/03 02:20

OS自体が少し古いバージョンなので2019年のラズビリアンOS 現在は、ラズベリーパイOSとして新しくなったようですので、一度OSを入れ替えて試します。
guest

回答1

0

ベストアンサー

systemdで動かしたときのカレントパスを見ていないだけではないでしょうか?
試しに、指定するファイルのパスを相対パスでなく、絶対パスにしてみてはいかがでしょうか。

投稿2020/12/03 01:22

TakaiY

総合スコア13767

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

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

shinchoroX

2020/12/03 01:45

アドバイスありがとうございます。 .serviceファイルが [Service] ExecStart=/usr/bin/python3 /home/pi/Leasemat/CC.py と記述していますので、確認してみます。 また、絶対パスも試してみます。
shinchoroX

2020/12/03 01:57

絶対パスに変更し、またinit.txtも名称を変更しましたが、症状は同じのようです。 (initが予約語の場合を想定し、別のファイル名にしました) Filepath = '/home/pi/Leasemat/futomomo.txt'
TakaiY

2020/12/03 04:12

そこだけでなく、以下の部分も変更しなくてはだめなのですが、そこも対応じていますか? new = '{0:%Y%m%d}.txt'.format(now) os.rename(path,new)
shinchoroX

2020/12/03 05:56

行けました!! 仰っる通り new = '{0:%Y%m%d}.txt'.format(now) も絶対パスに変更しました。 本当に本当にありがとうございます。 ラズベリーパイでは、/opt直下だと起動時のマウントが保証されている・・・との情報から、ここに入れてみたり、最新のOSを入れてみたりをしており、ご返信に気づきませんでした。 今まで簡単な組込み機器やシーケンサーのプログラムばかりでしたので、ファイルシステムと言いましょうか、OSの構造などを意識せずにプログラムをしておりました。 Pythonだけでなく、Linuxの入門書も買います。 本当にありがとうございました。
TakaiY

2020/12/03 06:33

解決してなによりです。 UNIXのプログラムでは、ファイルのパスやプロセスの動作しているパス(ワーキングパス)を気にするのは基本ではありますね。 systemdで起動するプロセスのワーキングパスは.serviceファイルの[service]セクションで「WorkingDirectory=」として設定することができるので、スクリプトの汎用性を高めたければこれで指定するのもありだと思います。、
shinchoroX

2020/12/03 06:42

追加のアドバイスまで頂き、ありがとうございます。 今まではIDE任せにしていた部分ですので、何をどうしているのかを少しずつですが勉強していきます。 systemdに関するアドバイスもありがとうございます。 今まではネットの流用でプログラムを組んでいましたので、しっかりと意味を理解するようにします。 (昨日の質問でもそうであったように) 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問