個人的にお借りしているサーバがあってそこで何個かbotを動かしているのだけど、そのサーバがセキュリティアップデート等で再起動した後、ログインしてscreen起動して、その中で画面割ってbot起動して、また別の画面でirssiを起動する、みたいな事を毎回やってた訳ですがいい加減めんどう臭くなってきたので自動化した。
まずscreenを自動起動する仕組みを考えた。rcスクリプトでもいいけど、そもそも共用サーバなのでroot権限が無い。そこでcronを使う。
ここで
また screen に渡している
あとは
ちなみに defshell を設定しないと cron から起動した場合は $SHELL が設定されていないので、
crontab -e
して
@reboot (. ~/.profile; /usr/bin/screen -d -m)
@reboot
という識別を使います。再起動して1回だけ実行されるコマンドが書けます。最近の linux であれば使えるかと思います。ここで
.profile
を読み込んでるのは、これをしないと screen が新しく起動するプロセスに対してインタラクティブシェルから起動していたはずの環境変数等を引き継いでくれないから。例えば最近の Ubuntu であれば ~/.bashrc
は
# If not running interactively, don't do anythingこんな風にインタラクティブシェルじゃない場合には読み込まない様になっている。編集してもいいんだけど、僕はどの環境でも使えるベストプラクティスを選んだ。
case $- in
*i*) ;;
*) return;;
esac
また screen に渡している
-d -m
、これが無いとコンソールと通信するはずの screen が端末にアクセス出来なくて死ぬ。起動してすぐデタッチしてます。あとは
~/.screenrc
で好きなように画面を割って各プロセスを起動すれば良い。
startup_message off僕の場合は、goreman というツールでサーバやbotを起動していて、それと irssi で画面分割している。
vbell off
defshell /bin/bash
defscrollback 1000
hardstatus string "%?%H %?[screen %n%?: %t%?] %h"
screen 0 irssi
screen 1 /home/mattn/bin/startup-servers
ちなみに defshell を設定しないと cron から起動した場合は $SHELL が設定されていないので、
/bin/sh
になってしまうのを回避する為に必要です。