cronで指定した時間にコマンドが正常に稼働しない原因と対策
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」の記事も増えてきました
ディスカッション
コメント一覧
まだ、コメントがありません