🕑
サーバ再起動しても cron で Web アプリを雑に立ち上げ
超楽に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