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

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

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

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

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Raspberry Pi

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

Python

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

Q&A

解決済

1回答

1530閲覧

RasberryPi【python】:G-mail送受信のcron定期実行が動作しない。

rockey_7625

総合スコア25

cron

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

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Raspberry Pi

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

Python

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

0グッド

0クリップ

投稿2021/12/31 02:21

編集2021/12/31 02:52

お世話になります。
ラズパイにてG-MAILのAPIを使用してメール送受信を定期実行させるプログラムを製作しているのですが
うまく動作せず困っております。。。

pycharm上で正常動作を確認し、さらにラズパイにpythonファイルを転送してラズパイのterminal上で
コマンドを実行してラズパイ上でも動作するところまで確認できています。
ただ、これをcronで設定して動作させようとすると何故か動作しません。。。【添付画像】

プログラム自体はPC/ラズパイで動作しているので間違いはないと思っているのですが
cronで動かないのが何故か解らないのです。。。。

色々調べたのですが、どうしても解らずすいませんが熟練の方々の知恵でアドバイス頂きたく
お手数です何とか宜しくお願い致します。
※ラズパイでcronの起動確認コマンドを実施したところ、cronは起動しているようです。【追記】
イメージ説明

python

1from google.oauth2.credentials import Credentials 2from googleapiclient.discovery import build 3import json 4import base64 5import smtplib 6from email.mime.text import MIMEText 7from email.utils import formatdate 8 9 10def get_header(headers, name): 11 for h in headers: 12 if h['name'].lower() == name: 13 return h['value'] 14 15mail_data_list = [] 16 17def main_recieve(): 18 scopes = ['https://mail.google.com/'] 19 creds = Credentials.from_authorized_user_file('token.json', scopes) 20 service = build('gmail', 'v1', credentials=creds) 21 22 messages = service.users().messages().list(userId = 'me', q = 'from: ipsum.240s-o.m@docomo.ne.jp').execute().get('messages') 23 24 for message in messages: 25 # print('=' * 30) 26 m_data = service.users().messages().get(userId = 'me', id = message['id']).execute() 27 28 # ヘッダー情報を取得 29 headers = m_data['payload']['headers'] 30 31 # 日付情報を取得 32 message_data = get_header(headers, 'date') 33 # print('日付: ' + str(message_data)) 34 35 #差出人情報を取得 36 from_data = get_header(headers, 'from') 37 # print('差出人: ' + str(from_data)) 38 39 # 宛先情報を取得 40 to_data = get_header(headers, 'to') 41 # print('宛先: ' + str(to_data)) 42 43 #件名情報を取得 44 sub_data = get_header(headers, 'subject') 45 mail_data_list.append(sub_data) 46 # print('件名: ' + str(sub_data)) 47 48 49def main_send(): 50 sendaddress = 'roidandios.2576@gmail.com' 51 password = '*********' 52 53 subject = 'テストメール' 54 bodyText = f'テストプログラム{mail_data_list}' 55 fromAddress = 'roidandios.2576@gmail.com' 56 toAddress = 'light.and.dark.7625@gmail.com' 57 58 smtpobj = smtplib.SMTP('smtp.gmail.com', 587) 59 smtpobj.starttls() 60 smtpobj.login(sendaddress, password) 61 62 msg = MIMEText(bodyText) 63 msg['Subject'] = subject 64 msg['From'] = fromAddress 65 msg['To'] = toAddress 66 msg['Date'] = formatdate() 67 68 smtpobj.send_message(msg) 69 smtpobj.close() 70 71 72if __name__ == '__main__': 73 main_recieve() 74 main_send()

raspi

1progman-7916@raspberrypi:~ $ sudo /etc/init.d/cron status 2● cron.service - Regular background program processing daemon 3 Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled) 4 Active: active (running) since Fri 2021-12-31 02:31:14 JST; 9h ago 5 Docs: man:cron(8) 6 Main PID: 370 (cron) 7 CGroup: /system.slice/cron.service 8 └─370 /usr/sbin/cron -f 9 1012月 31 11:36:01 raspberrypi CRON[10157]: (CRON) info (No MTA installed, discarding output) 1112月 31 11:36:01 raspberrypi CRON[10157]: pam_unix(cron:session): session closed for user progman-7916 1212月 31 11:39:01 raspberrypi CRON[10220]: pam_unix(cron:session): session opened for user progman-7916 by (uid=0) 1312月 31 11:39:01 raspberrypi CRON[10224]: (progman-7916) CMD (python /home/progman-7916/mail_recieve.py) 1412月 31 11:39:01 raspberrypi CRON[10220]: (CRON) info (No MTA installed, discarding output) 1512月 31 11:39:01 raspberrypi CRON[10220]: pam_unix(cron:session): session closed for user progman-7916 1612月 31 11:42:01 raspberrypi CRON[10259]: pam_unix(cron:session): session opened for user progman-7916 by (uid=0) 1712月 31 11:42:01 raspberrypi CRON[10263]: (progman-7916) CMD (python /home/progman-7916/mail_recieve.py) 1812月 31 11:42:02 raspberrypi CRON[10259]: (CRON) info (No MTA installed, discarding output) 1912月 31 11:42:02 raspberrypi CRON[10259]: pam_unix(cron:session): session closed for user progman-7916

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

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

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

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

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

otn

2021/12/31 10:51

画像が見づらいですが、「動作しません」と判断した根拠となる具体的事実は何でしょうか?
rockey_7625

2022/01/01 01:53

見て頂きありがとうございます。 動作しないと判断した理由はこのプログラムは実行すると最終的に自分のメールアドレス宛にメールが返ってくるのですが、コマンドによる手動スクリプト実行ではすぐにメールが返ってきます。 しかし、cronで実行させるとメールがいつまでたっても全く返ってこないので、動作しないと判断しました。 色々調べてやってみたのですが、原因が解っていないのです。。。
otn

2022/01/01 05:34

> 色々調べてやってみたのですが 端末からなら実行できるのにcronからだと期待通りで無いという原因はいろいろありますが、どの原因についてどのように調べて、どういう結果だったかを質問に追記してください。
rockey_7625

2022/01/01 05:56

今のところ当方がやってみたのは以下の通りです。 ・)cronの起動確認で(CRON) info (No MTA installed, discarding output)の記載が出ているので もしかしてpostfixを入れる必要があるのかと思いsudo apt-get install postfixでpostfixをインストール ↓ インストール後、再度cron動作確認したがNG 再度cron起動確認したが下記表示が抱ている状態で、これ以上自分ではどうすればよいか思いつかず 途方に暮れています。。 progman-7916@raspberrypi:~ $ sudo /etc/init.d/cron status [sudo] progman-7916 のパスワード: ● cron.service - Regular background program processing daemon Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2021-12-31 16:35:38 JST; 22h ago Docs: man:cron(8) Main PID: 351 (cron) CGroup: /system.slice/cron.service └─351 /usr/sbin/cron -f 12月 31 16:36:01 raspberrypi CRON[991]: (progman-7916) CMD (python /home/progman-7916/mail_rec…e.py) 12月 31 16:36:02 raspberrypi cron[351]: sendmail: fatal: open /etc/postfix/main.cf: No such fi…ctory 12月 31 16:36:02 raspberrypi postfix/sendmail[993]: fatal: open /etc/postfix/main.cf: No such f…tory 12月 31 16:36:02 raspberrypi CRON[987]: (progman-7916) MAIL (mailed 195 bytes of output but go…m MTA ) 12月 31 16:36:02 raspberrypi CRON[987]: pam_unix(cron:session): session closed for user progman-7916
otn

2022/01/01 06:35

> 端末からなら実行できるのにcronからだと期待通りで無いという原因はいろいろありますが、 については何も調べてないと言うことですね。 長くなるので、回答の方に書きます。
rockey_7625

2022/01/01 06:44

すいません、端末とcronで動作する・しないについてはどういう調べ方をすればよいか思いつかず 調べてないです。。。【cronは今回初めて使用したのでまだ細かい部分まで理解できていないため。】
guest

回答1

0

ベストアンサー

端末からなら実行できるのにcronからだと期待通りで無いという原因はいろいろありますが、
・実行ユーザーの違い(さすがにこれは気づくはず)
・環境変数の違い(この原因が多い。特にPATH
・カレントディレクトリーの違い(これもたまにある)
umaskの違い(これが原因と言うことはまず無い)
・端末に紐付いているかどうかによる動作の違い(無くはない程度か)
くらいでしょうか。

このサイトでの質問のケースだと大部分がPATHの違いです。
OSの設定にもよるでしょうが、cronからの起動でのPATHのデフォルトは/usr/bin:/binと基本コマンドしか使えない状態ですので、そこに無いコマンドを使うには、PATHを自分で設定するか、コマンドはフルパスで指定するかします。
それ以外の環境変数が動作に影響している可能性もあります。

cronから実行したコマンドで何らかの出力がある場合は、その結果がメールで実行ユーザーに送られます。

コメントにあるようにcronからメールを送ろうとしている(送ろうとして失敗した)ということは、cronで指定したコマンドが何らかの出力を行ったと言うことで、おそらくエラーメッセージでしょう。
メールを送る設定がされていないのであれば、

crontab

1* * * * * sh -c "実行したいコマンド" >/tmp/cron.log 2>&1

のようにそれをファイルに書いて内容を確認します。

PATHの設定ですが、端末でecho $PATHを実行してその結果が、仮に/usr/local/bin:/foo/bar/bin:/usr/bin:/binであれば、crontabの先頭にコピペします。

crontab

1PATH=/usr/local/bin:/foo/bar/bin:/usr/bin:/bin 2* * * * * コマンド 引数1 引数2

投稿2022/01/01 07:08

otn

総合スコア84645

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

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

rockey_7625

2022/01/01 08:18 編集

アドバイス頂き誠にありがとうございます。 すいませんが当方、Linuxはまだ初学者レベルで解っていない部分が多いのですが、頂いた指示を 以下行いました。 まず、crontabには以下を記載しました。 ---------------------------------------------- */3 * * * * python /home/progman-7916/mail_recieve.py * * * * sh -c "python mail_recieve.py" >/tmp/cron.log 2>&1 ---------------------------------------------- ※上記、何か入力おかしい部分があればご指摘下さい。 PATHについてはecho $PATHの実行結果は以下の通りです。 progman-7916@raspberrypi:~ $ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games すいません、ご指示頂いたcrontabへの記載 ”* * * * * コマンド 引数1 引数2” の部分は 当方の理解不足でどう入力すればよいか解らなかったので入力例ご教授頂けると幸いです。 取り急ぎ返信いたします。
otn

2022/01/01 08:09

> のようにそれをファイルに書いて内容を確認します。 を無視しないで確認しましょう。 2022/01/01 16:44 のコメントの /var/log/syslog の部分は無意味で邪魔なので、編集で消しておいてください。
otn

2022/01/01 08:09

> すいません、ご指示頂いたcrontabへの記載 ”* * * * * コマンド 引数1 引数2” の部分は 当方の理解不足でどう入力すればよいか解らなかったので入力例ご教授頂けると幸いです。 「コマンド」とか「引数」という単語の意味が理解できないと言うことですか?
rockey_7625

2022/01/01 08:28

すいません、少し細かく確認致します。 ・)2022/01/01 16:44 のコメントの /var/log/syslog の部分は無意味で邪魔なので、編集で消しておいてください。→削除しました。 ・)”> のようにそれをファイルに書いて内容を確認します。を無視しないで確認しましょう。”の部分は   crontabに以下を記載したのですが、”確認”とはlogの確認ではないのでしょうか? 【logの確認かな?と思い/var/log/syslogの結果を記載したのですが。。】 ---------------------------------------------- */3 * * * * python /home/progman-7916/mail_recieve.py * * * * sh -c "python mail_recieve.py" >/tmp/cron.log 2>&1 ---------------------------------------------- ・)「コマンド」とか「引数」という単語の意味が理解できないと言うことですか? →いえ、意味が理解できないのではなく今回のケースでどういうコマンド/引数を入力すればよいか解らない、という意味です。
otn

2022/01/01 09:56

なるほど。リダイレクトを知らないのですね。 「それをファイルに書いて」というのは、 コマンド >/tmp/cron.log は、コマンドの出力を/tmp/cron.logというファイルに書くという意味です。2>&1 の説明は割愛。
otn

2022/01/01 09:59

> 今回のケースでどういうコマンド/引数を入力すればよいか解らない、という意味です。 自分の実行したいコマンドと引数です。 2つの独立した話が並行して進んでいるのが理解しにくいようなので、 回答の「PATHの設定ですが、」以降は、問題が解決するまで保留にしておくのが良いでしょう。
setoppu

2022/01/01 11:11

横から失礼。 >---------------------------------------------- >*/3 * * * * python /home/progman-7916/mail_recieve.py >* * * * sh -c "python mail_recieve.py" >/tmp/cron.log 2>&1 >---------------------------------------------- >※上記、何か入力おかしい部分があればご指摘下さい。 2行目のスクリプトのパスはフルパスて書くべきではないかと。 たぶん、/tmp/cron.logにはmail_recieve.pyが見つからない。って残ることになると思いますよ。 動作しない。って原因については、おそらく指摘されている環境変数あたりだと思いますけど。
otn

2022/01/01 12:03

そうですね。ただ、今はまだ「原因の調べ方」を教えている途中なので、ファイルに書かれたエラーメッセージを見てもらって、原因を認識してもらい、それから修正です。
rockey_7625

2022/01/01 14:29

すいません、>/tmp/cron.logの中身の確認について詰まってしまいました。。 申しわけないのですがアドバイス頂きたく。 以下の通り作業を行いましたが、cron.logの中身を見ようとしたらPermission deniedが出てアクセス拒否されました。。。 ファイルモードは読取可なので読めると思うのですが、何故か拒否されてしまいます。。 ※下記、もし見当外れの作業を行っているのならお手数ですがご指摘下さい。 以下、端末上で progman-7916@raspberrypi:~ $ cd /tmp progman-7916@raspberrypi:/tmp $ ls cron.log pulse-PKdhtXMmr18n ssh-ytGRnF1N3EdD dhcpcd-(null) ssh-NcCAJjF8dP0U systemd-private-9e8ac93cbfc14c6ab1b9c8396afe3b64-rtkit-daemon.service-xUqMoZ progman-7916@raspberrypi:/tmp $ ls -l 合計 24 -rw-r--r-- 1 progman-7916 progman-7916 61 1月 1 22:00 cron.log drwx------ 2 progman-7916 progman-7916 4096 12月 31 16:35 dhcpcd-(null) drwx------ 2 root root 4096 12月 31 16:35 pulse-PKdhtXMmr18n drwx------ 2 progman-7916 progman-7916 4096 12月 31 16:35 ssh-NcCAJjF8dP0U drwx------ 2 progman-7916 progman-7916 4096 12月 31 16:35 ssh-ytGRnF1N3EdD drwx------ 3 root root 4096 12月 31 16:35 systemd-private-9e8ac93cbfc14c6ab1b9c8396afe3b64-rtkit-daemon.service-xUqMoZ progman-7916@raspberrypi:/tmp $ sudo cat cron.log [sudo] progman-7916 のパスワード: sh: 1: /home/progman-7916/mail_recieve.py: Permission denied
rockey_7625

2022/01/01 14:41

すいません、当方勘違いしていますかね?上記についてcron.logの中身は以下の通りということでしょうか? sh: 1: /home/progman-7916/mail_recieve.py: Permission denied
otn

2022/01/01 15:50 編集

そうですね。ファイルの中身がそのエラーメッセージで、それがcronで起動しない原因です。 が、メッセージが不審です。 * * * * sh -c "python mail_recieve.py" >/tmp/cron.log 2>&1 の行のエラーメッセージじゃないですね。 何を実行したのでしょう?
rockey_7625

2022/01/01 16:11 編集

すいません、自分でcrontab変えて試したので再度以下の通りcrontab元に戻してcron.log見てみました。 以下crontabです. ---------------------------------------------------- */3 * * * * python /home/progman-7916/mail_recieve.py * * * * sh -c "python mail_recieve.py" >/tmp/cron.log 2>&1 ----------------------------------------------------- 下記がcron.logの中身の結果です。 ------------------------------------------- progman-7916@raspberrypi:/tmp $ sudo cat cron.log File "mail_recieve.py", line 54 bodyText = f'テストプログラム成功!{mail_data_list}'                      ^ SyntaxError: invalid syntax -------------------------------------------- 構文エラー??と出ていますが、意味不明です。。 手動によるスクリプト実行では動作しているので、何故cronで動作させると上記エラーがでるのか。。。 再度、手動によるスクリプト実行してみましたが動作します。 うーん、意味がわかりません。。どう直せばいいのか。。。
otn

2022/01/01 16:22 編集

違うバージョンのPythonが動いているのでしょうね。 回答に書いたように、デフォルトだとcronで動くのは/usr/bin/pythonです。 実行結果が異なると言うことは普段は別のPythonを使っていると思うので、そのPythonのパスを type python で調べて、cronでもそれを指定しましょう。 私の手元の環境では/usr/bin/pythonを使っているので、cronのデフォルトでも同じ結果です。 あと、 > progman-7916@raspberrypi:/tmp $ sudo cat cron.log むやみにsudoする癖を付けると、いずれ痛い目を見ます。
rockey_7625

2022/01/01 16:47

先ほどcrontabを以下の通り修正したら動作しました!!! --------------------------------------------------- */3 * * * * /usr/local/bin/python3 /home/progman-7916/mail_recieve.py --------------------------------------------------- すいません、動かない意味が解りました。 ・)ラズパイのpythonのversionは3.7が入っており、手動スクリプト実行では問題なく動いているが cronで動作するpythonのバージョンは3.5以下のversion??で実行していたため、F文字列の構文が エラーになり実行できていなかった。【F文字列はverが3.6以上でないと動かない。】 最近、ラズパイのpythonのversionを3.7に上げたので当然そのversionで動くものと思い込んでいました。。 今回、非常勉強になりました! 本当に助かりました、ありがとうございます! ※むやみにsudoする件、今後なるべく付けないようにしたいと思います。
otn

2022/01/01 17:06

回答に書いた、 > ・環境変数の違い(この原因が多い。特にPATH) ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問