起動時にVNCサーバを自動的に起動する
Ubuntu 9.10のVPSサーバにUbuntuデスクトップをインストールし、TightVNCを使ってサーバに接続できています。しかし、このVPS上のVNCサーバはSSHでログインして以下のコマンドを入力しないと起動できません。
vncserver :1 -geometry 800x600 -depth 16 -pixelformat rgb565
このコマンドを起動時やスケジュールタスクとして実行しても起動しません。私の選択肢は何でしょうか?
Ubuntu 9.10のVPSサーバにUbuntuデスクトップをインストールし、TightVNCを使ってサーバに接続できています。しかし、このVPS上のVNCサーバはSSHでログインして以下のコマンドを入力しないと起動できません。
vncserver :1 -geometry 800x600 -depth 16 -pixelformat rgb565
このコマンドを起動時やスケジュールタスクとして実行しても起動しません。私の選択肢は何でしょうか?
私は、Googleで「起動時にubuntu launch vnc server on startup ](http://www.abdevelopment.ca/blog/start-vnc-server-ubuntu-boot)」と検索して、[ これらの指示 ](http://www.google.com/search?q=ubuntu%20launch%20vnc%20server%20on%20startup)を見つけました。
1.VNCサーバーをインストールします。
2. vncserver
を初めて起動してパスワードを設定。
3. 以下のファイルを/etc/init.d/vncserver
として追加します(USER、GEOMETRY、NAMEなどは必ずお好みで修正してください)。
4. sudo chmod +x /etc/init.d/vncserver
5. sudo update-rc.d vncserver defaults
#!/bin/sh -e
### BEGIN INIT INFO
# Provides: vncserver
# Required-Start: networking
# Default-Start: S
# Default-Stop: 0 6
### END INIT INFO
PATH="$PATH:/usr/X11R6/bin/"
# The Username:Group that will run VNC
export USER="mythtv"
#${RUNAS}
# The display that VNC will use
DISPLAY="1"
# Color depth (between 8 and 32)
DEPTH="16"
# The Desktop geometry to use.
#GEOMETRY="<WIDTH>x<HEIGHT>"
#GEOMETRY="800x600"
GEOMETRY="1024x768"
#GEOMETRY="1280x1024"
# The name that the VNC Desktop will have.
NAME="my-vnc-server"
OPTIONS="-name ${NAME} -depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY}"
. /lib/lsb/init-functions
case "$1" in
start)
log_action_begin_msg "Starting vncserver for user '${USER}' on localhost:${DISPLAY}"
su ${USER} -c "/usr/bin/vncserver ${OPTIONS}"
;;
stop)
log_action_begin_msg "Stoping vncserver for user '${USER}' on localhost:${DISPLAY}"
su ${USER} -c "/usr/bin/vncserver -kill :${DISPLAY}"
;;
restart)
$0 stop
$0 start
;;
esac
exit 0
もし、より動的な設定をして、複数のユーザが接続できるようにしたいのであれば、これを行うより良い方法があります。root 権限で /etc/sysconfig/vncservers というファイル(存在しない場合はディレクトリ)を作成します。
mkdir -p /etc/vncserver
touch /etc/vncserver/vncservers.conf
作成した vncservers.conf ファイルに以下のようなものを追加して、各ユーザに必要に応じてサーバを追加します。
VNCSERVERS="1:justin 2:bob"
VNCSERVERARGS[1]="-geometry 1920x1080 -depth 24"
VNCSERVERARGS[2]="-geometry 800x600 -depth 8"
次に空のinitスクリプトを作成して実行可能にします。
touch /etc/init.d/vncserver
chmod +x /etc/init.d/vncserver
/etc/init.d/vncserverに以下を追加します。
#!/bin/bash
unset VNCSERVERARGS
VNCSERVERS=""
[-f /etc/vncserver/vncservers.conf] && . /etc/vncserver/vncservers.conf
prog=$"VNC server"
start() {
. /lib/lsb/init-functions
REQ_USER=$2
echo -n $"Starting $prog: "
ulimit -S -c 0 >/dev/null 2>&1
RETVAL=0
for display in ${VNCSERVERS}
do
export USER="${display##*:}"
if test -z "${REQ_USER}" -o "${REQ_USER}" == ${USER} ; then
echo -n "${display} "
unset BASH_ENV ENV
DISP="${display%%:*}"
export VNCUSERARGS="${VNCSERVERARGS[${DISP}]}"
su ${USER} -c "cd ~${USER} && [-f .vnc/passwd] && vncserver :${DISP} ${VNCUSERARGS}"
fi
done
}
stop() {
. /lib/lsb/init-functions
REQ_USER=$2
echo -n $"Shutting down VNCServer: "
for display in ${VNCSERVERS}
do
export USER="${display##*:}"
if test -z "${REQ_USER}" -o "${REQ_USER}" == ${USER} ; then
echo -n "${display} "
unset BASH_ENV ENV
export USER="${display##*:}"
su ${USER} -c "vncserver -kill :${display%%:*}" >/dev/null 2>&1
fi
done
echo -e "\n"
echo "VNCServer Stopped"
}
case "$1" in
start)
start $@
;;
stop)
stop $@
;;
restart|reload)
stop $@
sleep 3
start $@
;;
condrestart)
if [-f /var/lock/subsys/vncserver]; then
stop $@
sleep 3
start $@
fi
;;
status)
status Xvnc
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
exit 1
esac
Stephenさんの回答にもありましたが、ログインしたいユーザ毎に少なくとも一度はvncserverを実行する必要があります。このステップを省略するとどれも動作しなくなるので、ここでは大文字にしています。rootであれば以下のようになります。
su justin -c vncserver
su bob -c vncserver
これにより、各ユーザのホームディレクトリに適切なスタートアップスクリプトを含む.vncディレクトリが作成されます。
update-rc.d vncserver defaults 99
これで各ユーザのホームディレクトリに適切な起動スクリプトを含む .vnc ディレクトリが作成されます。
service vncserver start
これで再起動するか、手動で次のように入力してサービスを開始することができます。
0x1&
と入力してください。
お世話になっている友人のUbuntuにアクセスして、インストールや設定をしたり、何かを教えたりしています。
インターネットからモデム経由でアクセスする必要があるため、vinoを使用しています。
アクセス中はすべての共有オプションとセキュリティオプションをオンにしています。
vino-serverを常にアクティブにしておきたくない。
システム>リモートデスクトップメニューがなかった。
/usr/share/applications/vino-preferences.desktopを以下のように編集しました。
# OnlyShowIn=Unity;
Exec=bash -c 'vino-preferences;/usr/lib/vino/vino-server&zenity --info --text="Accès par Internet: `curl http://ipecho.net/plain`:5900"'
出勤前に友人にリモートデスクトップ環境設定を起動してもらい、共有を許可する…をオンにしてもらう。
環境設定を終了するとvino-serverが起動し、使用するIPアドレスを教えてくれる。
作業が終わると、再びPreferenceを実行して、共有の許可…をオフにする。
環境設定を終了すると、vino-serverは停止し、たとえ共有オフの状態で起動していても停止してしまいます。
この手順は、ユーザーにとって最も安全であると同時に非常に便利だと思います。
PS: 開発者は自分のプログラムをローカル(ユーザセッション内)で実行することを好んでいます。
異なるユーザ用に複数の vnc が必要な場合は、複数の vncserverjohn, vncserverbill, … ファイルを作成するだけで、stephen jennings のソリューションを使うことをお勧めします。これにより、別々に起動/停止することができます。確かに、全てのユーザに共通のコードを一つのファイルに入れて、他のユーザからソースを取るのが良いプログラミングのやり方です。
私は、何人かの同僚が科学的なプログラミングやデータ評価を行っているサーバの責任を「継承」しています。このサーバは実際には何年も継続して安定して動作しており、ユーザは開いているウィンドウを保存することに怠惰になっています。しかし、単一の vncservers や X11 サーバがスタックしてしまうことがあり、1台のサーバを再び稼働させるためにすべてのユーザをシャットダウンするのは大迷惑です。