2013/07/31

Recent entries from same category

  1. 別のプロセスの動的な環境変数を盗み取る
  2. ぼくがかんがえたさいきょうの rebuild.fm クライアント
  3. grep で文字列を縦書きに変換
  4. Jekyll Meets Gitolite
  5. WalkmanをLinuxでSonicStage無しに転送する方法

個人的にお借りしているサーバがあってそこで何個かbotを動かしているのだけど、そのサーバがセキュリティアップデート等で再起動した後、ログインしてscreen起動して、その中で画面割ってbot起動して、また別の画面でirssiを起動する、みたいな事を毎回やってた訳ですがいい加減めんどう臭くなってきたので自動化した。 まずscreenを自動起動する仕組みを考えた。rcスクリプトでもいいけど、そもそも共用サーバなのでroot権限が無い。そこでcronを使う。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
vbell off
defshell /bin/bash
defscrollback 1000
hardstatus string "%?%H %?[screen %n%?: %t%?] %h"
screen 0 irssi
screen 1 /home/mattn/bin/startup-servers
僕の場合は、goreman というツールでサーバやbotを起動していて、それと irssi で画面分割している。
ちなみに defshell を設定しないと cron から起動した場合は $SHELL が設定されていないので、/bin/sh になってしまうのを回避する為に必要です。
Posted at by