March 18, 2011

CentOS5におけるSkypeのデーモン化

SkypeをCentOS5.5のデーモンとして扱えるようにする
CentOS5.5はX環境込みでインストール済みとする
前回、CentOS5環境にSkypeを導入した

これを
http://d.hatena.ne.jp/moriyoshi/20100926/1285517353
http://yusukezzz.net/blog/archives/2006
を参考にデーモン化する

まず、必要なパッケージ、
仮想フレームバッファを提供するXvfbと、接続するためのx11vncの導入を行う
Xvfbはおそらく導入済み
x11vncは正規のレポジトリにないのでRPMForgeから導入
# rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
# http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
# rpm -ivh rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
# yum -y update rpmforge-release
# yum install x11vnc
スクリプトを用意する、上記サイトからlaunch-skype.sh
#!/bin/bash
#
# Init file for daemonized Skype service
#
### BEGIN INIT INFO
# Provides:          skype
# Required-Start:    $local_fs $remote_fs $network
# Required-Stop:     $local_fs $remote_fs $network
# Default-Start:     3 4 5
# Default-Stop:      0 1 2 6
# X-Interactive:     false
# Short-Description: Start/stop daemonized Skype service
### END INIT INFO
#
# chkconfig: 345 80 10
#
# processname: skype
#
# pidfile: /var/run/skype.pid
#

if [ -r /etc/rc.d/init.d/functions ]; then
    . /etc/rc.d/init.d/functions
    log_daemon_msg() {
        msg=$1
        prog=$2
        echo -n $"$msg $prog: "
    }
    log_end_msg() {
        if [ "$1" = "0" ]; then
            success
        elif [ "$1" = "1" ]; then
            failure
        fi
        echo
    }

elif [ -r /lib/lsb/init-functions ]; then
    . /lib/lsb/init-functions
else
    echo "Could not find a helper script needed to run this script."
    exit 1
fi

DAEMON_USER=skype
PROGNAME=`basename $0`
PIDFILE=/var/run/skype.pid
XSERVERNUM=20
XAUTHFILE=/var/run/skype/Xauthority
LOGFILE=/var/log/skype/error.log
DBPATH=/srv/skype/conf
XAUTHPROTO=.
SKYPE=/opt/skype/skype
USERNAME=echo123
PASSWORD=blah

[ -f /etc/sysconfig/skype ] && . /etc/sysconfig/skype

prog="skype"
RETVAL=0

dircheck() {
    if [ ! -d `dirname "$1"` ]; then
        echo "`dirname \"$1\"` does not exist"
        return 1
    else
        return 0
    fi
}

start() {
    log_daemon_msg "Starting" "skype"
    if ! dircheck "$LOGFILE" || ! dircheck "$XAUTHFILE"; then
        log_end_msg 1
        echo
        RETVAL=1
        return 
    fi 
    MCOOKIE=`mcookie` && \
    sudo -u "$DAEMON_USER" env XAUTHORITY=$XAUTHFILE sh -c "xauth add \":$XSERVERNUM\" \"$XAUTHPROTO\" \"$MCOOKIE\" >> \"$LOGFILE\" 2>&1" && \
    sudo -u "$DAEMON_USER" env XAUTHORITY=$XAUTHFILE sh -c "Xvfb :$XSERVERNUM -screen 0 800x600x8 -nolisten tcp >> \"$LOGFILE\" 2>&1 & echo \$!" >"$PIDFILE" &&
    sleep 3 && \
    (sudo -u "$DAEMON_USER" env DISPLAY=:$XSERVERNUM XAUTHORITY=$XAUTHFILE SKYPE="$SKYPE" sh -c "echo \"$USERNAME $PASSWORD\" | nohup \"$SKYPE\" --dbpath=\"$DBPATH\" --pipelogin &") >> "$LOGFILE" 2>&1 && \
    (log_end_msg 0 && [ -d /var/lock/subsys ] && touch /var/lock/subsys/skype || true) \
        || (RETVAL=$?; kill -TERM `cat $PIDFILE`; log_end_msg 1)
}

stop() {
    log_daemon_msg "Stopping" "skype"
    if [ -e "$PIDFILE" ]; then
        kill -TERM `cat $PIDFILE` && \
        rm -f $PIDFILE && \
        if [ -d /var/lock/subsys ]; then rm -f /var/lock/subsys/skype; fi && \
        log_end_msg 0 || log_end_msg 1
    else
        log_end_msg 1
        RETVAL=1
    fi
}

usage() {
    echo "Usage: $PROGNAME {start|stop|restart}"
}

case $1 in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    *)
        usage
        RETVAL=255
        ;;
esac

exit $RETVAL
をダウンロードして/etc/init.d/skypeとして保存
スクリプトで変更が必要なのは
DAEMON_USER :どのユーザーでSkypeを起動するか(root以外が望ましい)
DBPATH :どこに履歴等の情報を確保するか
USERNAME :どのSkypeアカウントでログインするか
PASSWORD :上記USERNAMEのアカウントのパスワード
DBPATHは、テスト運用時などに便利なので/home/user/.Skypeを指定するのがオススメ
上記に加えて冒頭を
# chkconfig: 345 99 10 ←(変更)
# description: skype launch script←(追記)
# processname: skype
と編集
また、スクリプトのために
/var/log/skype,/var/run/skypeをDAEMON_USERが読み書きできるように作成
さらに、DBPATHもDAEMON_USERが読み書きできるように作成
以上が終了したら
# chkconfig --add skype
# chkconfig skype on
# service skype start
で自動起動に登録して起動
あとは、
# x11vnc -display :20 -xauth /var/run/skype/Xauthority
とした後に適当なVNCクライアントで接続、利用許諾へのサインや、必要なコンタクトを追加を行う

No comments:

Post a Comment