🕑

サーバ再起動しても cron で Web アプリを雑に立ち上げ

2024/03/09に公開

超楽にRubyで雑に書いたスクリプトをsystemdで管理したい! - 宇宙行きたい で systemd がユーザ権限で使えることを知る。

開発環境用では nohup と cron の @reboot を使っていました。こちらもお手軽なので紹介。

@reboot とは

crontab(5) に @reboot があれば使えます。その名の通りリブート時に一回だけ実行。Ubuntu なら利用可能。

$ man 5 crontab
(省略)
       Instead of the first five fields, one of eight special strings may appear:

              string         meaning
              ------         -------
              @reboot        Run once, at startup.
              @yearly        Run once a year, "0 0 1 1 *".
              @annually      (same as @yearly)
              @monthly       Run once a month, "0 0 1 * *".
              @weekly        Run once a week, "0 0 * * 0".
              @daily         Run once a day, "0 0 * * *".
              @midnight      (same as @daily)
              @hourly        Run once an hour, "0 * * * *".

crontab の書き方

$ crontab -e
@reboot /home/oooooooo/work/cron-reboot.sh > /tmp/cron-reboot.log 2>&1

cron-reboot.sh の中身

Sinatra や Rails、Chalice などの雑なアプリが十数個並びます。Ruby や Python を使っているため asdf で管理。

アプリが追加されたらこの cron-reboot.sh に追加するだけ。

cron-reboot.sh
#!/usr/bin/bash
# @reboot /home/oooooooo/work/cron-reboot.sh > /tmp/cron-reboot.log 2>&1

set -ex

# API キーなどの環境変数
source "/home/oooooooo/.secret"
source "/home/oooooooo/.asdf/asdf.sh"

cd "/home/oooooooo/work/some-sinatara-pp" || exit
./run.sh

cd "/home/oooooooo/work/some-rails-app" || exit
./run.sh

cd "/home/oooooooo/work/some-chalice-app" || exit
./run.sh

nohup でバックグラウンド実行

それぞれの run.sh の中身はこんな感じ。nohup があるのは ssh して起動することがあるため。

nohup ruby app.rb &
nohup rails server -p 3008 -b 0.0.0.0 &
nohup chalice local --port 3013 --host 0.0.0.0 &

これで apt upgrade の OS リブートも気軽に行えるようになりました。

Discussion