cronで指定した時間にコマンドが正常に稼働しない原因と対策

2017年8月2日

60爺は、前回Raspberrypiで天気予報を喋らせることが出来たので、これを cron に登録しました。

0 8,12,15,20,22 * * * python3 /home/pi/python_pg/open_jtalk/talk_weather_3.py

8,12,15,20,22時に天気予報をしゃべってくれるはず…なんですが、時間になっても何も喋ってくれません。何故、喋ってくれないのでしょうか?

そこで、syslogを見てみました。以下のようなメッセージが出ています。

Jul 26 08:00:35 raspberrypi CRON[7159]: (CRON) info (No MTA installed, discarding output)

どうやら、print文で出力した結果を出せないよと言ってます。ログも出ていません!

スポンサーリンク

喋らない原因は?コマンドがない?

そこで、ググって、ログを出せるようにしてみました。

cron で > /dev/null して椅子を投げられないための3つの方法

記事に従い、当初のpython実行コマンドを次のように変更しました。

しかし、頭にある実行時が時間指定のままだと、その時間が来るまで延々と待ち続けなくてはならないため、テストには向きません。そのため、2分ごとにしゃべっていただくように変更しました。

*/2 * * * * python3 /home/pi/python_pg/open_jtalk/talk_weather_3.py 2>&1 | logger -t mycommand -p local0.info

すると、ログが出て jsay がありませんよって言ってます。またまた疑問が出てきてしまいました!

Jul 22 07:14:01 raspberrypi CRON[15613]: (root) CMD (python3 /home/pi/python_pg/
open_jtalk/talk_weather_3.py 2>&1 | logger -t mycommand -p local0.info)
Jul 22 07:14:01 raspberrypi mycommand: jsay 7月22日、7時14分1秒
Jul 22 07:14:01 raspberrypi mycommand: Traceback (most recent call last):
Jul 22 07:14:01 raspberrypi mycommand: File "/home/pi/python_pg/open_jtalk/talk_weather_3.py", line 68, in <module>
Jul 22 07:14:01 raspberrypi mycommand: main()
Jul 22 07:14:01 raspberrypi mycommand: File "/home/pi/python_pg/open_jtalk/talk_weather_3.py", line 15, in main
Jul 22 07:14:01 raspberrypi mycommand: say_datetime()
Jul 22 07:14:01 raspberrypi mycommand: File "/home/pi/python_pg/open_jtalk/talk_weather_3.py", line 24, in say_datetime
Jul 22 07:14:01 raspberrypi mycommand: proc = subprocess.Popen(shlex.split(text))
Jul 22 07:14:01 raspberrypi mycommand: File "/usr/lib/python3.4/subprocess.py", line 859, in __init__
Jul 22 07:14:01 raspberrypi mycommand: restore_signals, start_new_session)
Jul 22 07:14:01 raspberrypi mycommand: File "/usr/lib/python3.4/subprocess.py", line 1457, in _execute_child
Jul 22 07:14:01 raspberrypi mycommand: raise child_exception_type(errno_num, err_msg)
Jul 22 07:14:01 raspberrypi mycommand: FileNotFoundError: [Errno 2] No such file or directory: 'jsay'

このエラー「No such file or directory: 'jsay’」ですが、「カレントディレクトリに、jsay がない」ということを示しています。

jsay は、/usr/local/bin に存在しているんですが、カレントディレクトリにないので、No such file or directory と表示されてしまうようです。

どうやら、PATH を指定してやれば解決しそうだと当たりが付きました。


定時に音声出力復元

そこで cron に、以下の環境変数を追加することで解決できました。

PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
# 
# m h dom mon dow command 
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin 
*/15 * * * * sudo sh /home/pi/python_pg/graph_data/display.sh 
0 8,12,15,20,22 * * * python3 /home/pi/python_pg/open_jtalk/talk_weather_3.py

後追いですが、参考記事にあるサイトを見つけました。

この記事の中で「セキュリティの面からもパスを追加するならこの方法が良いと思う。」と言っていますし、動いてるから、まア、良しとしましょう。

今までPATHをつけたことはなかったんですが、これだけなんで必要なのかという疑問はあるものの、結果オーライで余計な詮索は止めにします^^;

最後に

前回の記事で、時刻と天気予報をcronで指定した時間に喋らせるようにしたんですが、コマンドが正常に稼働しませんでした。

そこで、何が原因なのかを探って、その対策をとりました。

原因自体は、jsayが指定されたファイルにないという単純なモノでした。

結局、新たにPATH指定をすることで対応が取れました。

■思えば、「openjtalk」の記事も増えてきました

参考
cron実行時の環境変数を設定

スポンサーリンク
この記事を書いた人

60爺

60路を越え、RaspberryPi と出会い、その関係でブログ開設(2017/2~)となりました。始めてみると、コツコツやるのが性に合ってしまい、漢字の記事から家の補修・将棋・windows10関係・別名・言い方などジャンルを拡大して今に至ってます。まだまだ、元気なので新たな話題を見つけて皆様に提供できればと思っています。「プロフィールはこちら

openjtalk

Posted by 60爺