レベルアップ

Pythonとcronで自動化処理を定期実行するときの権限周りの話

今回はPythonを使ってcronで何かの処理を定期的に実行しようとした時に権限周りで少しつまづいた話を共有しようと思います!

そもそもcronとは

cron とは、ジョブ(スクリプト)を自動実行するためのデーモンプロセスです です。 とりあえず命令した通りにプログラムを実行してくれる便利なやつって思っておけば良いです。

準備

これを使えば、自分で操作しなくても勝手に自動化できる!やった! f:id:sugarking:20210509155958p:plain

と思い調べてみると、どうやらcrontabにスクリプトを記述するだけで楽々自動化をできることを知ります。

で、作成ある自動化プログラムAを実行しようとした時にcrontabにこんな感じで書くわけです。

0 12 * * * {pythonが通っているパス} {実行したいファイルがあるパス}/main.py  > {エラーログを出力するパス}

ちなみに↑は毎日12時に, 実行したいファイルがあるディレクトリの中のmain.pyっていうファイルを、ここにあるpythonを使って実行してねていう命令をしています。

僕はanacondaの仮想環境下にあるpythonを使用しているのでこんな感じになっています。

0 12 * * * /opt/anaconda3/envs/dev_py/bin/python /Users/{ユーザ名}/Develop/python-project/main.py  > /Users/{ユーザ名}/Develop/python-project/exec-error.log 2>&1

ちなみにcronで実行してエラーが出た場合、ターミナルで確認することができますが、いちいち見るのめんどいので、ログとして出力しておくと便利です。

本題

さて12時になりました。あれ?でもmain.pyが実行できていないぞ?? となりました。そこでexec-error.logをみて見ました。 すると

/bin/sh: 1: {実行したいファイルがあるパス}/main.py: Permission denied

みたいなエラーが出ていました。初めて見る人は、は?って感じですよね。 これはcron君にはmain.pyを実行する権限がないよ!ってことを言っています。 じゃあ権限を与えてあげると良さそうです。

権限を変更させてあげるにはchmodで権限を書き換えてあげれば良いです。 chmodというのは このファイルには「書き込み」と「読み込み」と「実行」の三つの権限を設定できるよ!どんなふうに設定する!? っていうコマンドです。

なので今回は実行の権限を与えてあげると良さそうです。 ターミナルで

chmod -x {実行したいファイルがあるパス}/main.py

みたいに指定すれば良いです。 -xでそのファイルに対して実行の権限を与えてあげています。 (詳しいことは省きますがググればいっぱい出てきます)

ここまでやると多分動くようになります。

よき自動化ライフを。