お金をかけずにサーバーの勉強をしよう

LinuxOS起動時にスタートさせる(cron簡易版)

2022年6月7日

メニューへ戻る

パッケージインストールをしたプログラムの場合はOS起動時に自動起動してくれるものが多いですが、そうではない自作のサーバープログラム等を自動起動したい事があると思います。

古い LinuxOSの場合は initという仕組み、新しいものは systemdという仕組みを持っていて、その作法に従って設定をすることで自動起動が出来るのですが、それぞれ本が出来てしまう程度には前提知識を求めるものです。

そこまで探求するつもりはないけど自動起動はしたいという人には、簡易版として cronという仕組みもあります。

cronは LinuxOSが持っているスケジューリング機能で、指定した日時や特定時間での繰り返しでのプログラム実行をすることができます。

cronの日時指定のうち「OS起動時」を指定できますので、これを利用して常駐プログラムを起動させます。

Linuxの常駐プログラム(ずっと動き続けているプログラムでOS起動時に自動起動させるものが多い)は、依存関係を持つものがあります。
分かりやすい例では、WEBサーバープログラムは、ネットワークを使えるようにするプログラムに依存しています。

initや systemdはその依存関係もしっかり押さえていて cronは押さえていないという違いがありますので、cronによる自動起動には厳密には問題があるのですが、実践的なテクニックの一つとして知っておくと役に立つと思います。

勉強の対象が systemdの設定ではなく、常駐プロセスの起動方法でもなく、起動したあとのプロセスを使った何かである場合、自宅環境であればこれで十分な気がします。


それでは実際にやってみましょう。

例として、GitBucketインストール で JavaプログラムをOS起動時から起動させたい思いがありましたので、これを使ってやってみます。

これは、Ubunt Server 22.04環境の gitbucketユーザーで gitbucket.war というファイルを実行するものです。

cronはOSユーザー各々で設定できるスケジューラですので、以下のような作業になります。
・Ubuntu Server 22.04に gitbucketユーザーでログイン
・cronにコマンドラインを設定
・再起動
これだけ。

一つ一つやっていきましょう。

Ubuntu Server 22.04に gitbucketユーザーでログインした後から開始します。
crontab -e というのが cron設定の変更コマンドです。
初回だけどのエディタを使うか聞いてきますので、私は vimの 2を選んでいますが、お好きなものを。

gitbucket@UbuntuServer2204:~$ crontab -e

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny
  4. /bin/ed

Choose 1-4 [1]: 2

エディタが立ち上がってこのような画面になります。
# で始まるのがコメント業なので、一番下に追加をします。

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# 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


以下のように1行追加しました。
行頭の[@reboot]が起動時の実行指定で、その後が実行コマンドです。

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# 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

@reboot /usr/lib/jvm/jdk-18/bin/java -jar ~/gitbucket.war 2>&1 >> ~/.gitbucket/gitbucket.log &

これでOSを再起動したところ、ちゃんと GitBucketが起動していました。

こういったスケジューラの使い方を覚えておくと便利なので、もう少し cronについて書いておきます。

cronでのスケジューリングでは @reboot は結構珍しく、どちらかというと繰り返し処理によく使われています。

その場合の指定の仕方はこんな感じ。

59 23 31 12 * HappyNewYear

この例で何となく分かると思いますが、HappyNewYearが実行コマンドとして、左から
・分(0-59)
・時(0-23)
・日(1-31)
・月(1-12)
・曜日(日曜日:0 〜 土曜日:6)
となっています。

必ずしも全ての数値が具体的になっている必要はなく、ワイルドカードの * が使えたり、分の所を */5 で5分おきとか、幾つかの書き方で柔軟なスケジューリングができますので、色々試してみると面白いと思います。


実際の業務では、残念ながら cronはあくまでOSインフラレベルの処理に使われるまでのことが多いです。

これは、cronにはカレンダー設定の機能がなく「顧客の営業日だけ実行したい」という要件には足りなかったことにありました。
また、1つのスケジュールで実行できるコマンドが1つであり、複数の実行コマンドの前後関係を持たせたり並行動作させたりといった制御はできません。

業務システムのサーバーではこういった要件がよくあるので、日立製作所のJP1/AJSといった市販のジョブスケジューラを導入する事が多かったですね。
とは言っても、cronは Unix/LinuxのOS運用管理者には必須知識ですので、お勉強しておいて損はないと思います。