見出し画像

特定のファイルを定期的に自動実行する(Ubuntu編)

 前の記事にて、天気痛対策として、気圧急上昇を検知したらLINE通知する仕組みをpython3にて作りました。とても便利かつ効果的に使えているのですが、今まで手作業で都度、プログラムを実行してました。
 そこで、この仕組みが自動的に動作する環境を整えます。私の場合、次の3つの候補が考えられました。
 1) Windowsパソコンを使う
 2) MacOSパソコンを使う
 3) クラウド環境、無償枠で使えるLinuxを使う
1.Windowsは稀に使う程度、既にPython3実行環境を整えてあるノートパソコンを持っている。2.MacOSはバックアップ用途であり使ってないデスクトップパソコンを持っている。Python実行環境は標準で入っているPython2がある。3.クラウド環境はAWS, GCPのアカウントがあるが仮想サーバーの準備すら出来ていない。
 こうして、過去の記事のようにWindows10で動かすことができました。
 今回、ようやく 3) クラウド環境が用意できたので、自動的に動作する環境を Ubuntu で設定したので、その手順を記録します。

【前提】※4つの前提条件は整える手順をリンク先の記事に記します
・Ubuntu環境がある (今回は Google Cloud Platform で構築)
Python3 動作環境がある
・適切に時刻設定を行なっている
・実行したいファイルを Ubuntu環境に保存(転送)済みである
・vim (テキストエディタ)を操作できる

【概要】
・Ubuntu で定期的に自動実行するには cron を用いる
・/etc/cron.d ディレクトリ配下に任意のファイル名で定義ファイルを作成
・定義ファイルには、cron の書式に従い、時刻、実行ユーザー、実行コマンドを記載する

【使ったコマンド】
・sysctl status cron
・vim
・cat
・systemctl restart cron

【失敗から学んだこと】
・作業当初は時刻設定をデフォルトのまま(つまり標準時間)で行なっていた
 → 基本設定は最初にやるべき
・結果、定期的な自動実行が9時間ズレた
・時刻設定でゾーンを JST(日本時間)に変更したが事象は変わらなかった
・cron を再起動することで事象が改善された
 → 困ったらプロセスの再起動・・?

【ログ】

### cron 初期状態を確認

$ sysctl status cron
sysctl: cannot stat /proc/sys/status: No such file or directory
sysctl: cannot stat /proc/sys/cron: No such file or directory
$ 

### /etc/cron.d というディレクトリに拡張子なしのファイルを作成する
### 所定の書式に沿って定期実行する時刻、ユーザー名、実行コマンドを記載する
### この例では、"pushline" というファイル名で作成している
 
$ sudo vim /etc/cron.d/pushline 

### エディタ vim の画面に遷移、編集、保存

### 毎朝、6:45 に "pressure_line.py" を実行する
### username は実際のユーザー名を書く必要があるので注意
### cat コマンドで作成したファイルの中身を確認
 
$ cat /etc/cron.d/pushline 
45 6 * * * username /usr/local/bin/python3 /home/username/pressure_line.py

### cron 状態を確認、状態が Active (起動中) に変わったことを確認できた

$ 
$ systemctl status cron
● cron.service - Regular background program processing daemon
   Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2022-12-13 17:19:55 JST; 1 weeks 5 days ago
     Docs: man:cron(8)
 Main PID: 1684 (cron)
    Tasks: 1 (limit: 1114)
   CGroup: /system.slice/cron.service
           └─1684 /usr/sbin/cron -f

Dec 25 17:17:01 mygcp-push-line-1 CRON[14887]: pam_unix(cron:session): session closed for user root
Dec 25 18:17:01 mygcp-push-line-1 CRON[14949]: pam_unix(cron:session): session opened for user root by (uid=0)
Dec 25 18:17:01 mygcp-push-line-1 CRON[14950]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Dec 25 18:17:01 mygcp-push-line-1 CRON[14949]: pam_unix(cron:session): session closed for user root
Dec 25 19:17:01 mygcp-push-line-1 CRON[14990]: pam_unix(cron:session): session opened for user root by (uid=0)
Dec 25 19:17:01 mygcp-push-line-1 CRON[14990]: pam_unix(cron:session): session closed for user root
Dec 25 20:17:01 mygcp-push-line-1 CRON[15264]: pam_unix(cron:session): session opened for user root by (uid=0)
Dec 25 20:17:01 mygcp-push-line-1 CRON[15265]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Dec 25 20:17:01 mygcp-push-line-1 CRON[15264]: pam_unix(cron:session): session closed for user root
Dec 25 20:31:01 mygcp-push-line-1 cron[1684]: (*system*pushline) RELOAD (/etc/cron.d/pushline)
$ 

### 途中で時刻設定のゾーンを変更したせいか、9時間ズレたまま定時実行される
### そこで、cron を再起動する

$ sudo systemctl restart cron
 
### cron を再起動した後、改めて cron 状態を確認した

$ systemctl status cron
● cron.service - Regular background program processing daemon
   Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2022-12-27 18:02:22 JST; 21s ago
     Docs: man:cron(8)
 Main PID: 24203 (cron)
    Tasks: 1 (limit: 1114)
   CGroup: /system.slice/cron.service
           └─24203 /usr/sbin/cron -f

Dec 27 18:02:22 mygcp-push-line-1 systemd[1]: Started Regular background program processing daemon.
Dec 27 18:02:22 mygcp-push-line-1 cron[24203]: (CRON) INFO (pidfile fd = 3)
Dec 27 18:02:22 mygcp-push-line-1 cron[24203]: (CRON) INFO (Skipping @reboot jobs -- not system startup)
$ 

### この結果、想定通りの日本時間で定期実行されるように修正された

この記事が気に入ったらサポートをしてみませんか?