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

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

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

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

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Ubuntu

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

Q&A

解決済

2回答

4630閲覧

cronでpython実行できないです

highway

総合スコア1

cron

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

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Ubuntu

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

0グッド

0クリップ

投稿2020/07/29 21:31

前提・実現したいこと

Ubuntu 16.04.6でPython2.7で書いたプログラムをcronで定期実行しようとしています。
usbrhで温湿度を計測し、sql serverに書き込むプログラムを書きました。
ターミナルでプログラムそのものを実行すれば問題なく動きます。

発生している問題・エラーメッセージ

crontab -e で下記の行を追加しました。
*/5 * * * * /root/myprogram.py

試したこと

sudo /root/myprogram.py にしたり、python2.7のフルパス指定で
sudo /usr/bin/python2.7 /root/myprogram.pyをしましたが動きません。
/etc/init.d/cron restartでcronを再起動したり、
chmod a+x myprogram.pyで権限を変えたりもしましたが変わりなしです。

どなたか、お知恵をお貸しいただけると幸いです。

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

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

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

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

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

guest

回答2

0

「動かない」の状況を正しく把握しましょう。おそらくは「動かない」のではなく、「動いたが、エラーになるなど動作が期待通りで無い」という事だと思います。

エラーになるなど何らかの出力があれば、ユーザーにメールが届きます。
あるいは、

crontab

1*/5 * * * * /root/myprogram.py >/tmp/log 2>&1

で、/tmp/logに出力が書かれますので、メールの設定をしていない場合は、それを見て状況を把握します。

おそらくは、環境変数の内容の違いによる物でしょう。

投稿2020/07/29 23:18

otn

総合スコア84555

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

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

highway

2020/07/29 23:42

回答ありがとうございます。今夜ログを出力してこちらに追記したいと思います。よろしければまた見ていただければ幸いです。ログを出力してというのは数日前にやって調べてみたのですが、いまいち内容がよく分からず放置していました。
highway

2020/07/30 23:41 編集

こんばんは print 'hello'だけのpythonプログラムを作成し、cronで実行してみました。 */2 * * * * /usr/bin/python2.7 /root/crontest.py >> /root/find.log find.log #cat find.log hello hello hello hello hello hello CRONは実行されているようです。 環境変数がおかしいのでしょうか?(私もそう思っています)
otn

2020/07/30 22:58

> print 'hello'だけのpythonプログラムを作成し、cronで実行してみました。 いや、そうじゃなくて、 */5 * * * * /root/myprogram.py >/tmp/log 2>&1 をやってください。
highway

2020/08/01 03:30

お世話になります。 */2 * * * * /usr/bin/python2.7 /root/myprogram.py >/tmp/log 2>&1 を登録し、logに出力させてみました。 # cat log Traceback (most recent call last): File "/root/myprogram.py", line 5, in <module> runcmd1 = subprocess.check_output(["usbrh", "-t"])[0:5] File "/usr/lib/python2.7/subprocess.py", line 567, in check_output process = Popen(stdout=PIPE, *popenargs, **kwargs) File "/usr/lib/python2.7/subprocess.py", line 711, in __init__ errread, errwrite) File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory どういう意味のエラーでしょうか?最後はファイルまたはディレクトリがありませんと言われているようですが。
otn

2020/08/01 04:17

usbrhが見つからないというエラーでしょうね。 PATHが通ってないと思われます。 PATH=コマンドラインで見たときにPATHに設定されている文字列 */2 * * * * /usr/bin/python2.7 /root/myprogram.py >/tmp/log 2>&1 とcrontabファイルにPATH設定を書きましょう。
guest

0

ベストアンサー

まずは、最終目的のmyprogram.pyではなく、もっと単純なやつで試してみて下さい。何か文字列をprintするだけ、みたいなsimple.pyを作成し、「sudo crontab -e」して、

*/5 * * * * /usr/bin/python2.7 /root/simple.py >> /root/simple.log

を設定します。5分間隔で/root/simple.logの内容が追記されていれば、cron自体は正常に処理されています。

次に、usbrhで計測した値を(SQL Serverではなく)ファイルに追記していくスクリプトに差し替えて試し……といった具合に、少しずつ目的に近づけて原因を探るといいかと思います。

投稿2020/07/29 22:22

Daregada

総合スコア11990

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

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

highway

2020/07/29 23:38

おはようございます。助言いただきありがとうございます。 今夜簡単なpythonプログラムで試してみて結果をこちらに報告させていただきます。
highway

2020/07/30 23:41 編集

こんばんは print 'hello'だけのpythonプログラムを作成し、cronで実行してみました。 */2 * * * * /usr/bin/python2.7 /root/crontest.py >> /root/find.log find.log #cat find.log hello hello hello hello hello hello CRONは実行されているようです。
Daregada

2020/07/30 22:44

これで少なくとも「cronでPythonを実行できる」ということは分かったので、次はusbrhから取得した値をファイルに追記するプログラムで試してみてください。 後は、別コメントで言及した「数日前のログ」の内容が残っていればそれを提示してください。
highway

2020/08/01 03:25

こんにちは。 usbrhで取得した値をtxtに書き込むプログラムを作成しました。 import subprocess runcmd1 = subprocess.check_output(["usbrh", "-t"])[0:5] f = open('find.txt','w') f.write(runcmd1) f.close 単体で実行した場合はfind.txtに温度が出力されました。 しかし、*/2 * * * * /usr/bin/python2.7 /root/usbrhtest.py >/tmp/log2 2>&1 を記載しましたが、動作しませんでした。数日前のログは残っていなかったので、上記のようにlog2に出力させてみたところ、下記のような出力がありました。 Traceback (most recent call last): File "/root/usbrhtest.py", line 2, in <module> runcmd1 = subprocess.check_output(["usbrh", "-t"])[0:5] File "/usr/lib/python2.7/subprocess.py", line 567, in check_output process = Popen(stdout=PIPE, *popenargs, **kwargs) File "/usr/lib/python2.7/subprocess.py", line 711, in __init__ errread, errwrite) File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory
Daregada

2020/08/01 03:35

まずは、subprocess.check_output()の第一引数で指定している「usbrh」を、フルパスで指定してください。コマンドラインで「which usbrh」で表示されるやつです。 これで大分原因が見えてきました。 /etc/crontabを編集して、cronで実行する際の環境変数PATHの設定を変更すれば、python2.7やusbrhをフルパスで書く必要はなくなります。/root/crontest.pyはフルパスじゃないとダメでしょうが。
highway

2020/08/01 03:58

ありがとうございます! 引数をusbrhのフルパスで記載したところ無事cron実行できるようになりましたm(_ _)m logにも何も出力されなくなりました。 2週間くらい悩んでいたので、本当に感謝感激です。
Daregada

2020/08/01 04:05

ええと、元の/root/myprogram.pyに、今回のテストで引っかかったのと同じ部分、つまり「環境変数PATHが自分の環境と同じであることを期待して、ファイル名だけで起動しようとしている部分」がないか確認して、それらすべてを修正してください。usbrhだけでなく、sql serverに書き込む箇所にもあるかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問