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

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

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

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Python

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

Q&A

解決済

3回答

4619閲覧

cronでpython実行(Ubuntu16.04)

quiqui59911225

総合スコア16

cron

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Python

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

0グッド

0クリップ

投稿2018/09/14 05:40

ある時間が来たらpythonのコードを実行したいと思い調べてみたらcronというものがあることを知りました。
ノートPCのMacで調べながらやって見たらできたのでUbuntuでもやってみようと思ってやってみたところ、
できなかったので質問させてください。
###実行環境
Ubuntu16.04 LTS

###やったこと

/etc/rsyslog.confで/var/log/cron.logのコメントアウトを外しました。
次に、cronの設定をしました。

$ crontab -e

起動したエディタの編集内容は以下です。

SHELL=/bin/bash PATH=/home/user-name/anaconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin RAILS_ENV=production */3 * * * * /home/user/anaconda3/bin/python /home/user/Desktop/hello.py >> /var/log/cron.log 2>>&1

実行したいpythonファイル:hello.pyの中身は以下です。

import matplotlib import matplotlib.pyplot as plt print('Hello') plt.figure() plt.plot([1,2,3],[1,2,3]) plt.savefig('/home/user/Desktop/exam.png') plt.close()

シンプルに文字列の出力と、ただの標準出力だけでなくモジュールのインポートも含めて動作確認するために画像の出力をするプログラムにしています。

cron.logの出力

$ cat /var/log/cron.log と打つと以下のように表示されました。

Sep 14 14:20:01 user-X9DA7 CRON[13525]: (user) CMD (python /home/user/Desktop/hello.py >> /var/log/cron.log 2>>&1) Sep 14 14:20:01 user-X9DA7 CRON[13524]: (CRON) info (No MTA installed, discarding output)

これはcronはちゃんと起動していて、コマンドも指定したものをやろうとはしているということなのでしょうか?
2行目のは出力やエラーを通知するメールの宛先がない(=MAILTOの設定がない)だけで問題はないということを調べました。

試したこと

いろいろなことをネットで調べて、
・テストのつもりで1分後に実行しようとするとうまく行かない→3分おきに実行するように設定
・$ /etc/init.d/cron restart で再起動も試した
・PATHは、$ echo $PATH でPC本体で通っているパスを確認し、とりあえず全部入れたのでpythonへのパスやモジュールのインポートは問題ないはず

など、いろいろなことは試したのですが、グラフがデスクトップに保存されていません。
初心者なので、何か重大な設定の忘れや、誤っているところがあるかもしれません。

どなたか、解決策をご存知でないですか?

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

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

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

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

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

guest

回答3

0

Python

1print('Hello')

が悪さをしています。

cronでは、スクリプトの実行結果、何らかの出力があった場合(標準出力、エラー出力問わず)、「メール」で指定したユーザ(デフォルトではroot)にメールを送信するようになっています。

一方で、メール送信サーバが当該の環境にインストールされていないため、メール送信できず、cronがエラーとなっている、という流れです。

解決法は二通りのいずれかです。

  • postfixなどのメール送信サーバをインストールし、メールが送れるよう設定する
  • スクリプトを変更し、標準出力に何も出力しないようにする(要はprintの一行を削除する)

投稿2018/09/14 07:17

kazto

総合スコア7196

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

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

quiqui59911225

2018/09/19 04:52

回答ありがとうございます。print文を消してみましたがうまくいきませんでした。 なのでpostfixも試してないです。
guest

0

自己解決

回答していただいたお二人の方、改めてありがとうございました。
原因がわかったのでここに書かせていただきます。

問題だったのはmatplotlibのところで、次のようにしなくてはいけませんでした。

import matplotlib matplotlib.use('Agg') # 追加した行 import matplotlib.pyplot as plt ---以下略---

これは、私が以前、AWSのUbuntuでmatplotlibを使ったときにも行った対策で、
どうやら「GUIがない環境では、matplotlibのバックエンドを指定する必要がある」そうです。
通常なら、

_tkinter.TclError: no display name and no $DISPLAY environment variable

RuntimeError: Invalid DISPLAY variable

などの環境変数DISPLAYに関したエラーが出るみたいです。

以前経験していたからこそ気づけましたが、cronでの実行logしか見てなく(見ることができず)、
エラーメッセージを確認できなかったためにどこが原因か見つけるのが大変でした。

投稿2018/09/19 05:06

quiqui59911225

総合スコア16

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

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

0

pythonの実行自体はされていると思います。
ただ、pythonの中でエラーが起きてるんだとおもいます(推測ですが)

もしかしたら治るかもしれない解決方法をいくつか書いておくので試してみてください。だめだったらごめんなさい

1.crontab 内のコマンドを変える

bash

1*/3 * * * * /home/user/anaconda3/bin/python /home/user/Desktop/hello.py >> /var/log/cron.log 2>>&1 2 34*/3 * * * * python hello.py >> /var/log/cron.log 2>>&1

2.hello.pyの実行権限を増やす

bash

1chmod +x hello.py

3.crontabをルートで実行する。

bash

1crontab -u root

あと、解決方法ではないですが
いったん hello.pyの実行を行ごとにprintでみてみて、止まっているのかどうか、完全終了しているのかどうかを調べると解決しやすいかもしれません。

投稿2018/09/14 07:05

sitoa

総合スコア54

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

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

quiqui59911225

2018/09/19 04:53

回答有り難うございます。すべてやってみましたがうまくいきませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問