勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

Cockpitでプログラムの自動実行(systemd timer)設定を行う方法

  サーバー

Cockpitでプログラムの自動実行設定を行いたい。調べたところCronは難しそうだけどsystemd timerであれば設定できるみたい。以下にPHPとPythonを自動実行設定する方法をメモ。

 

Cockpitについて

導入方法

Cockpit自体の導入方法については過去記事参照。

バージョンについて

以下コマンドでバージョンを確認できる。

rpm -q cockpit

#以下が出力された(バージョン310)
cockpit-310.8-1.el8_10.x86_64

 

実行するプログラム

実行するプログラムはどちらの現在日時をファイルに追記していくというもの。以下ソースコード。

PHP(log.php)

<?php
date_default_timezone_set('Asia/Tokyo');
file_put_contents('/path/to/test_php.log', date('Y/m/d H:i:s') . "\n", FILE_APPEND);

Python(log.py)

from datetime import datetime
import zoneinfo

tokyo_tz = zoneinfo.ZoneInfo("Asia/Tokyo")
current_time = datetime.now(tokyo_tz).strftime("%Y/%m/%d %H:%M:%S")

with open("/path/to/test_python.log", "a", encoding="utf-8") as f:
    f.write(current_time + "\n")

注意点

Cronと同様相対パスだと正常に動作しないので絶対パスで記述すること。

 

自動実行(systemd timer)設定

PHPとPythonの絶対パスの確認

以下コマンドで絶対パスを確認しておく。Pythonについてはインストールしているバージョンによってコマンド内容が異なるかも。

#phpの絶対パスの確認
which php

#以下が絶対パスになる
/usr/bin/php

#pythonの絶対パスの確認
which python3.9

#以下が絶対パスになる
/usr/bin/python3.9

自動実行の設定

Cockpitにログインし「左メニューのサービス→ページ上部のタイマー→ページ右上のタイマーの作成」に進み、以下の通り設定する。

  • 名前 → 半角英数字と特定の半角記号「:」「_」「.」「@」「-」で名前を入力
  • 説明文 → 説明文を入力。日本語可。
  • コマンド → 「絶対パス 実行したいファイル」を記述する。
  • トリガー → 実行したい時間を指定する。

以下のような形。

設定状況の確認

正常に登録された場合「左メニューのサービス→ページ上部のタイマー」に進むとタイマー一覧上に「設定した名前.timer」の項目が表示される筈。

項目を選択すると詳細ページに遷移し、ログの確認やタイマーの再起動・停止・削除・起動等が行える。

尚、新しめのバージョンのCockpitだとこちらのページからタイマー設定内容の編集が行えるらしいが、私の環境(バージョン310)だとこちらのページでは編集できない。

そのため以下の方法で編集する。

設定の変更

設定用ファイルを編集する必要があるのでSSH接続して作業するか、もしくは以前メモしたファイルマネージャーで作業する必要がある。特にこだわりがなければファイルマネージャーを導入してそちらで作業した方が楽かも。

「/etc/systemd/system」に「【設定した名前】.timer」「【設定した名前】.service」というファイルがあるので編集する。また、各ファイルについては以下概要となる。

  • .timer → トリガー(実行時間)に関する設定ファイル
  • .service → コマンド(どのファイルを実行するか等)に関する設定ファイル

尚、編集後は当該タイマーを再起動すること。

時間に関する設定方法の要点

.timerファイルを編集する際、記述方法がCronとは変わっておりよく使いそうな内容は以下の通り。

  • 毎分実行 → *-*-* *:*:00
  • 10分毎に実行 → *-*-* *:00/10
  • 毎時0分に実行 → *-*-* *:00:00
  • 毎日4時に実行 → *-*-* 04:00:00
  • 毎週月曜の4時に実行 → Mon *-*-* 04:00:00

尚、覚えるのが面倒くさい場合はビルダーツール等を使うと便利かも。

コマンドに関する注意点

特に何も指定しない場合、タイマーはrootで実行される。また、今回実行されるプログラムは「ファイルを追記する(ファイルが無い場合は新規作成する)」という内容になり、新規作成された場合のファイルの所有者・グループはrootになってしまう。

これを回避するには以下のようにユーザーを指定する必要がある。

/usr/sbin/runuser -u test_user -- /usr/bin/php /path/to/log.php

「/usr/sbin/runuser」はrootから一般ユーザ権限に切り替えるためのコマンドでその後test_userを指定し、log.phpを実行するという意味になる。

Cockpit上で特定のタイマーを削除できない場合

コマンドの入力ミス等でタイマー起動エラーになった場合、Cockpit上でそのタイマーが削除できなくなるケースに遭遇した。そのような場合は対応する「.timer」「.service」を削除の上、以下コマンドを実行するとCockpit上にも反映される筈。

#設定の再読み込み
systemctl daemon-reload

#状態の確認
systemctl reset-failed

 

所感

今回初めてsystemd timerというのを聞いた。どうやらCronから移行していっているようで、その背景等はこちらの記事が参考になった。

 - サーバー

  関連記事

サーバ管理ツール「Cockpit」にファイルマネージャー用プラグインを導入する方法
サーバ管理ツール「Cockpit」にファイルマネージャー用プラグインを導入する方法

先日メモしたサーバ管理ツール「Cockpit」にブラウザ上からファイルの作成や編 ...

サーバー管理をブラウザベース(GUI)で行えるCockpitの導入方法
サーバー管理をブラウザベース(GUI)で行えるCockpitの導入方法

以前にサーバ管理をブラウザ上で行えるWebminについてメモしたが、もっと機能を ...