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
になってしまうのを回避する為に必要です。