シュウジマブログ

Apple製品,技術系の話をするブログ

Raspberry PiでPythonプログラムをsudo管理者権限で自動的に起動させる(cron編)

Keywords : Raspberry Pi Python sudo 管理者権限 スタートアップ 自動起動 cron.

背景(読まなくてもいい)

masa-flyu.hatenablog.com

上記の記事にあるプログラムについて,自動起動をしようと,下記の過去記事

masa-flyu.hatenablog.com

の方法試みましたが,うまくいきませんでした.エラーログとか見る方法もよくわからなかったので,今回はまったく別の方法でPythonプログラムの自動起動をやってみました.

この手のワードで検索して一番初めに出てくるこちらのページ

hendigi.karaage.xyz

の3番目の方法になります.

対象

最初のリンクを見ていただければわかりますが,今回のプログラムはPythonで動くkivyというGUIのアプリケーションです.

環境は

です.

cronの紹介

cronはコマンドを定期実行することができるLinuxの機能です.

make.bcde.jp

方法

編集するファイルを開く

端末で

crontab -e

と打ちます.

初回起動時は,どのエディタで起動するかを選択させられるかと思いますが,わからなければ「nano」を選びましょう(簡単なので).

すると,テキストエディタnanoでファイルが開きます. 私の場合ファイル名が「/tmp/crontab.i2t3P8/crontab」で内容は

# Edit this file to introduce tasks to be run by cron.
#

...(中略)...

# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

となっていました,この後に行を追加していきます.

cronの書式(若干脱線)

ここで一旦,cronの一般的な使い方に触れておきます.

定期的な実行

1つ目の使い方は

* * * * * コマンド

の形式で5つの値(分や時間を表す)を入れるものです.

この方法では,コンピュータの起動中に定期的に実行したい処理を記述できます.

1度きりの実行

2つ目の方法は数値を指定する代わりに,@から始まる特定の状態を入れるものです.

qiita.com

書式は

@状態 コマンド

となります.

この方法では,コンピュータがとある状態のときのみ実行したい処理を記述できます.

今回はこの@の書式で起動直後を表す@rebootを使用します.

ファイルへの追記(本題)

先ほどのファイルにコマンドを記述していきます.

Pythonプログラムを起動直後に実行するもっとも簡単な方法は

@reboot python /home/pi/...(ディレクトリ).../hoge.py

です.

これで起動できればなんの問題もありません(動かない場合は次の項へ).

編集結果を保存するには,nanoの場合

  • Ctrl + O (編集結果の名前をつけて保存)
  • Enter (名前を変えずにEnterすることで上書き)
  • Ctrl + X (nanoの終了)

の順で終了します.

実行

ファイルの追記が完了したら,再起動すれば,プログラムが実行されるはずです.

残念ながら後述の通り私はできませんでした.カレントディレクトリや管理者権限(sudo)の問題だったようです.

発展的な方法

複数のコマンドの実行

私の場合,ライブラリの中にカレントディレクトリが重要なものがあったようで,上記の1行では完全に動作しませんでした.

そこで,普段起動しているときと同じように

の順で実行することにします.

コマンドを複数連ねるには ; セミコロンで区切ります.

先ほどの1行を以下のように書き換えました.

@reboot cd ~/fuga/fuga/fuga/ ; python2 ./hoge.py

~はホームディレクトリという意味の短縮表記です.なお,python2となっていますが,私がpython2を指定する必要があったというだけで,3ならpython3でいいですし,pythonだとデフォルトの方が起動します.

私はこれでも動きませんでした.I2Cなどの通信を利用しており,管理者権限が必要なようです.

管理者権限

管理者権限が必要な場合は,単純にsudo を追記すれば

@reboot cd ~/fuga/fuga/fuga/ ; sudo python2 ./hoge.py

文法上は成立します.しかしこれでも動きません.

実際,このコマンドを打つとわかりますが,sudoで実行する場合はパスワードの入力が必要になります.

これをあらかじめコマンドで入力しておく必要があります.

qiita.com

これを反映させると,先ほどまでのコマンドをさらに編集して

@reboot cd ~/fuga/fuga/fuga/ ; echo ******** ; sudo -S python2 ./hoge.py

となります.結局,私のcronのファイルは f:id:masa_flyu:20181011033447j:plain

のようになりました.

これで起動できました.