
Ubuntu日本語フォーラム

ログインしていません。
SIPサーバのアプリケーション ser (0.9.7-1) を起動しようとすると、次のようなエラーが出て起動させることが出来ません。
/usr/sbin/serctl start
Starting SER : PID file /var/run/ser.pid does not exist -- SER start failed
何が原因か教えて頂けますでしょうか?
Ubuntuのバージョンは、8.04 LTS (デスクトップ版)です。
serのインストールはSynapticパッケージマネージャで実行しました。
インストール直後に自動で起動する際は問題なく起動できたのですが、いったん終了して、再度起動しようとするとダメでした。
以降、何度か起動を試みましたが、同じ現象が続いています。
よろしくお願い致します。
オフライン
エラーメッセージをそのまま解釈すればPIDファイルが存在していないようですが、/var/run/ser/pid というファイルは存在しますか?
自動起動する場合のスクリプトを調べてみると、/usr/sbin/serctl をキックする場合との違いがわかるかもしれません。
オフライン
mizuno様 ご回答ありがとうございます。
mizuno による投稿:
エラーメッセージをそのまま解釈すればPIDファイルが存在していないようですが、/var/run/ser/pid というファイルは存在しますか?
/var/run/ser.pid というファイルはエラーメッセージ通り、存在しません。
#なぜ、このファイルが存在しない(生成されていない)のですか? と質問させて頂いた方が良かったですね。
ser.cfg を見てみたんですが、それらしい記述は見つかりませんでした。
Googleで同様の症状が報告されているサイトを見つけ、そこでは、moduleをloadする際に対象のmoduleのpathが
ser.cfgの中で正しく記述されていないことが原因でした。なので、ser.cfgをチェックしてみたんですが、moduleのpathは正しく
記述されていました。
mizuno による投稿:
自動起動する場合のスクリプトを調べてみると、/usr/sbin/serctl をキックする場合との違いがわかるかもしれません。
「自動起動する場合のスクリプト」はどうやって確認すればよろしいでしょうか?
よろしくお願い致します。
オフライン
uchan21 による投稿:
「自動起動する場合のスクリプト」はどうやって確認すればよろしいでしょうか?
誠に恐縮ながら、自身では ser をインストールすらしていないので、的確な回答では無いかもしれないことをあらかじめお断りしておきます
ubuntu (Debian 派生デストリビューション) では、Synaptic パッケージマネージャなどを用いて導入したサーバーアプリケーションの起動、終了には /etc/init.d/ 以下にあるスクリプトを使うようになっています
ser の場合は多分 /etc/init.d/ser というスクリプトを使うようになっていると思います
具体的には、以下のように引数を付けて実行します
起動: /etc/init.d/ser start
終了: /etc/init.d/ser stop
終了後再起動: /etc/init.d/ser restart
結局はスクリプトの中で /usr/sbin/serctl (もしくは /usr/sbin/serctl が呼び出す ser の本体部プログラム) を呼び出しているだけのことですが、その前後に雑多な設定を行っていることもあります
エラーメッセージから予想するに、この場合は /var/run/ser.pid を作成しておいてから /usr/sbin/serctl start を呼び出すとか、別の場所 (多分 /var/run/ser/ser.pid) の PID ファイルを使うようにしている可能性が考えられます
一度 /etc/init.d/ ディレクトリの中を覗いてみて ser の起動スクリプトだと思われるもの使ってみてはどうでしょう
オフライン
ry様 ご回答ありがとうございます。
ryさん:一度 /etc/init.d/ ディレクトリの中を覗いてみて ser の起動スクリプトだと思われるもの使ってみてはどうでしょう
教えていただきました通り、/etc/init.d/ser ありました。全部を下の方にコピペしました。
また、serctlの対応すると思われる部分も抜粋してみました。
ただ、両者を比べて見ても、私にはどうすればよいか、見当がつきません。。
何かアドバイスしていただけることはありますでしょうか?
よろしくお願い致します。
---- serctlより抜粋 ----
# configuration for starting/stopping ser
PID_FILE=/var/run/ser.pid
SYSLOG=1 # 0=output to console, 1=output to syslog
STARTOPTIONS= # for example -dddd
DIR=`dirname $0`
SERBIN=$DIR/ser
AWK=awk
--------------------
---- /etc/init.d/ser の内容 ----
#! /bin/sh
#
# skeleton example file to build /etc/init.d/ scripts.
# This file should be used to construct scripts for /etc/init.d.
#
# Written by Miquel van Smoorenburg <[email protected]>.
# Modified for Debian GNU/Linux
# by Ian Murdock <[email protected]>.
#
# Version: @(#)skeleton 1.8 03-Mar-1998 [email protected]
#
# adapted for ser by Andrei Pelinescu-Onciul <[email protected]>
# $Id: ser.init,v 1.3.2.1 2006/01/11 00:23:10 janakj Exp $
### BEGIN INIT INFO
# Provides: ser
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Should-Start:
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: SIP Express Router
# Description: Start the SIP Express Router daemon.
### END INIT INFO
PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/ser
NAME=ser
DESC=ser
PIDFILE=/var/run/$NAME/$NAME.pid
PARAMS="-P $PIDFILE -u ser -g ser"
test -f $DAEMON || exit 0
set -e
case "$1" in
start)
echo -n "Starting $DESC: $NAME"
start-stop-daemon --start --quiet --pidfile $PIDFILE \
--exec $DAEMON -- $PARAMS
echo "."
;;
stop)
echo -n "Stopping $DESC: $NAME"
start-stop-daemon --oknodo --stop --quiet --pidfile $PIDFILE \
--exec $DAEMON
echo "."
;;
#reload)
#
# If the daemon can reload its config files on the fly
# for example by sending it SIGHUP, do it here.
#
# If the daemon responds to changes in its config file
# directly anyway, make this a do-nothing entry.
#
# echo "Reloading $DESC configuration files."
# start-stop-daemon --stop --signal 1 --quiet --pidfile \
# $PIDFILE --exec $DAEMON
#;;
restart|force-reload)
#
# If the "reload" option is implemented, move the "force-reload"
# option to the "reload" entry above. If not, "force-reload" is
# just the same as "restart".
#
# Check if ser configuration is valid before restarting the server
(($DAEMON -c 2>&1) | grep "config file ok, exiting") > /dev/null
if [ $? -ne 0 ]; then
($DAEMON -c 2>&1)
echo -e "\nThere are errors in the configuration file. Please fix them first"
echo -e "\n$out\n"
exit 0
fi
echo -n "Restarting $DESC: $NAME"
start-stop-daemon --oknodo --stop --quiet --pidfile \
$PIDFILE --exec $DAEMON
sleep 1
start-stop-daemon --start --quiet --pidfile \
$PIDFILE --exec $DAEMON -- $PARAMS
echo "."
;;
*)
N=/etc/init.d/$NAME
# echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac
exit 0
オフライン
ry さんの言う通り、
起動: sudo /etc/init.d/ser start 終了: sudo /etc/init.d/ser stop 終了後再起動: sudo /etc/init.d/ser restart
でサーバーのスタート、ストップ、リスタートが操作できます。
私もserを入れてないので確実ではないですが、ubuntuでサーバーの起動操作の作法はそうなっていますよ。
オフライン
問題になっている pid ファイルに関する部分だけを抜粋します
serctl
PID_FILE=/var/run/ser.pid
/etc/init.d/ser
NAME=ser
PIDFILE=/var/run/$NAME/$NAME.pid
これをみると、明らかに pid ファイルを作成する場所が互いに異なっていることが分かります
つまり、ubuntu のパッケージを使って ser をインストールしたときは、ser の起動、終了などの操作に serctl を使うと問題が生じる可能性が高い (というより明らかに問題が生じる) ということです
ubuntu のサーバーアプリケーション制御の作法に則って、/etc/init.d/ser を使うようにしましょう
オフライン
ry様、yama様 ありがとうございます。
sudo /etc/init.d/ser start を使うと、起動は出来ました。
しかし、SIPクライアントからの登録処理が出来ませんでした。
起動はしたんだけど、正しく動作していない状況なのかもしれません。
---
次に、serctlを次のように変更して、
serctl
PID_FILE=/var/run/ser/ser.pid
/etc/init.d/ser
NAME=ser
PIDFILE=/var/run/$NAME/$NAME.pid
/usr/sbin/serctl startを実行したところ、
$ /usr/sbin/serctl start
Starting SER : PID file exists! () already running?
$ /etc/init.d/ser stop
Stopping ser: ser.
$ /usr/sbin/serctl start
Starting SER : PID file exists! () already running?
となって、起動できませんでした。
上記の引用は、startしたら、今度はPID file exists!と言われたので、/etc/init.d/ser stopで止めてから、
再度トライしたけどダメだった、という一連の流れです。
---
さらに、次に、serctlへ加えた変更を元に戻して、sudoを付けて起動したところ、
$ sudo /usr/sbin/serctl start
Starting SER : started pid(8539)
起動できました。
SIPクライアントからの登録処理も成功した。
おそらく、1回目にうまく起動できたのと同じ状態ではないかと思います。
---
結論としては、/usr/sbin/serctl startを実行する時に、sudoを付けていなかっただけということなんですが、
今回の状況の原因として、妥当と言えるのでしょうか?
もし、そうであれば、大変お騒がせしてしまい申し訳ありません。
オフライン
多分、serctl ファイル中の
PID_FILE=/var/run/ser/ser.pid
を
NAME=ser PIDFILE=/var/run/$NAME/$NAME.pid
に変更したときでも、sudo serctl start とすれば起動できたと思います
システムの動作に関する操作をする (管理者権限が必要な) ときは、原則としてそれらのコマンドの前に sudo をつけて実行します
ここまでの私のコメントでは、そのことを失念していたため不要な手間を掛けさせてしまっていたかもしれません
さて
uchan21 による投稿:
さらに、次に、serctlへ加えた変更を元に戻して、sudoを付けて起動したところ、
$ sudo /usr/sbin/serctl start
Starting SER : started pid(8539)
起動できました。
SIPクライアントからの登録処理も成功した。
おそらく、1回目にうまく起動できたのと同じ状態ではないかと思います。
インストール直後は、sudo /etc/init.d/ser start を使って自動的に起動されるので、若干違いがあると思います
先に提示いただいた内容からすると、/etc/init.d/ser start では /usr/sbin/ser -P /var/run/pid/ser.pid -u ser -g ser を起動しているようです
serctl の方では (これを修正する前は)、/usr/sbin/ser -P /var/run/ser.pid のように起動していると思われます
この場合、/usr/sbin/ser を起動するユーザー、グループは root、root になるので、/usr/sbin/ser -u root -g root で起動したのと同じことになります
このことから
uchan21 による投稿:
sudo /etc/init.d/ser start を使うと、起動は出来ました。
しかし、SIPクライアントからの登録処理が出来ませんでした。
このような状況になる原因としては、SIP クライアントからの登録情報を書き込む場所 (ファイル、ディレクトリ) のアクセス許可が、ユーザー: ser、グループ: ser に対して割り当てられていない可能性が考えられます
多分、serctl ファイル中の
STARTOPTIONS= # for example -dddd
を
STARTOPTIONS= -u ser -g ser # for example -dddd
のように修正して、sudo /etc/init.d/ser start を実行したときと同様に、/usr/sbin/ser がユーザー: ser、グループ: ser で起動するようにすると、SIP クライアントからの登録処理ができなくなると思います
逆に、/etc/init.d/ser ファイル中の
PARAMS="-P $PIDFILE -u ser -g ser
を
PARAMS="-P $PIDFILE -u root -g root
または
PARAMS="-P $PIDFILEのように修正して、sudo /etc/init.d/ser start とすれば、SIP クライアントからの登録もうまくいくような気がします
最後の編集者: ry (2009-01-11 09:16:05)
オフライン
ry様 詳細なご回答をありがとうございます。
”権限”の関係は、Linux初心者の私には、鬼門の一つであります。
後々、同じようなトラブルに遭遇した時のために、肝に銘じておきたいと思います。
ところで今回の件は、serのバグというわけではないと考えてよろしいですよね。
↑ こういう質問は未だ私の知識が心許ないレベルであることを曝していますがご容赦いただければ幸です。
#Ubuntuの画面は、ウィンドウズに比べるとソフトで、目にやさしいですね。
#最近目が疲れやすくてウィンドウズPCをいじってると、しばしば目から来ると思われる頭痛に悩まされるのですが、Ubuntuだと幾分楽です。
オフライン