
Ubuntu日本語フォーラム

ログインしていません。
bluetoothのログを取るプログラムを作成しました.
OSを起動してからプログラムを実行すると,期待通りの結果が出力されるのですが,
デーモンとして以下のシェルスクリプトを作成して/etc/init.dにおいて再起動すると期待通りに起動しなくなりました.
プログラムは公開できないのですが,
http://people.csail.mit.edu/albert/bluez-intro/c404.html
ほぼそのままここにあるプログラムです.
ファイルを作成してログを書き込んでいるのですが,空ファイルが作成されただけで
プロセスもそれ以降死んでいるみたいでした.
予想ではbluetoothのデーモンが起動するまえに,今回のプログラムのデーモンが起動してしまってエラー終了してると思います.
bluetoothのデーモンが起動したあとに今回のプログラムを起動したいのですが,
このように順序付けることは可能でしょうか?
それとも依存関係みたいなのをデーモンに持たせることができるのでしょうか?
よろしくおねがいします.
#!/bin/sh
# chkconfig: 2345 91 91
# description: bluetooth daemon script.
. /lib/lsb/init-functions
PATH=/sbin:/bin:/usr/sbin:/usr/bin
#DAEMON=/usr/local/sbin/btdaemon
DAEMON=/home/foofoo/experiment/20100903/test
DAEMON_NAME=`basename $DAEMON`
DIR="/home/foofoo/experiment/20100903"
PIDFILE="$DIR/pid/test.pid"
set -e
case "$1" in
start)
echo -n "Starting $DAEMON_NAME:"
start-stop-daemon --start --pidfile ${PIDFILE} --make-pidfile --quiet --background --exec ${DAEMON}
;;
stop)
echo -n "Stopping $DAEMON_NAME:"
start-stop-daemon --stop --pidfile ${PIDFILE}
;;
restart)
echo -n "Restarting $DAEMON_NAME:"
stop && start
;;
*)
echo $"Usage: $DAEMONNAME {start|stop|status}" >&2
exit 1
;;
esac
exit 0
オフライン
追記です.
OS起動時にこのプログラムをデーモンとして起動はできませんが,OS起動終了後に
$ sudo /etc/init.d/hogehoge start
とすると期待通りに起動することができました.
ですが,相変わらずOS起動した瞬間にき
オフライン
gentoo という distritution ではデーモンプログラムをコンパイルした後に、
rc-update add xxx default のような操作をします。
ubuntu での正しい操作は分かりませんが、
/etc/rc5.d あたりにシンボリックリンクを作ってみてはいかかでしょう。
オフライン
koachi による投稿:
追記です.
OS起動時にこのプログラムをデーモンとして起動はできませんが,OS起動終了後に
$ sudo /etc/init.d/hogehoge start
とすると期待通りに起動することができました.
btdaemonが以下で起動しているので、
### BEGIN INIT INFO # Provides: bluetooth # Required-Start: $local_fs $syslog $remote_fs dbus # Required-Stop: $local_fs $syslog $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start bluetoothd ### END INIT INFO
起動が完了すると、「Provides: bluetooth」されます。自作デーモン側でも以下のようにINIT INFOを書いてやって、「Required-Start:」節でbluetoothを要求してやるように書いておくと、update-rc.d時点でS25Bluetooth以降に起動されるようにシンボリックリンクが造られるはずです。これで望んだ挙動にならないでしょうか。
ただ、試す前に、OS起動後にbluetooth daemonを止めた状態だと同じ挙動になるのか、ということを試してからの方がいいかような気がします。本当にbluetoothdがあがっていないことが原因なのかは分からないわけで。
### BEGIN INIT INFO # Required-Start: $local_fs $syslog $remote_fs dbus bluetooth # Required-Stop: $local_fs $syslog $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 ### END INIT INFO
オフライン
返信ありがとうございます.
実はこのデーモンnetwalkerで動かそうとして,ノートPCで試しているところなんです.
$ sudo update-rc.d ssh defaults 99
このように実行したところノートPCでは期待通りに動いてくれたのですが,
netwalkerに移したところ,空ファイルが作成されただけです
#起動後に
#$ sudo /etc/init.d/hogehoge start
#このようにすると期待通りの動きになりました.
うまくいく可能性がもうちょっとありそうなので,INIT INFOを試してみます.
オフライン
### BEGIN INIT INFO
# Required-Start: bluetoothd
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
このように記述したところ,改善されませんでした.
オフライン
デーモンの起動順序を云々する前に、自作プログラムがエラー終了する正確な原因を追及した方が良いのではないでしょうか
bluetooth のデーモンを停止した状態で、自作プログラムを実行するとどうなりますか?
bluetooth のデーモンを開始した直後に、自作プログラムを実行するとどうなりますか?
場合によっては、bluetooth のデーモンの起動と連続して自作プログラムを実行して確認することも必要かもしれません
# そもそも自作プログラム自身のエラーログを吐くようにしてはどうかという気もしないではない
オフライン
ry による投稿:
デーモンの起動順序を云々する前に、自作プログラムがエラー終了する正確な原因を追及した方が良いのではないでしょうか
bluetooth のデーモンを停止した状態で、自作プログラムを実行するとどうなりますか?
bluetooth のデーモンを開始した直後に、自作プログラムを実行するとどうなりますか?
場合によっては、bluetooth のデーモンの起動と連続して自作プログラムを実行して確認することも必要かもしれません
# そもそも自作プログラム自身のエラーログを吐くようにしてはどうかという気もしないではない
bluetoothのデーモンを停止した状態ですと,空ファイルが作成されただけです.
bluetoothのデーモンを開始した直後ですと,期待通りです.
デーモンとして登録するまえに,端末上で動作が期待通りだったので,エラーログの出力をおこたっていました.
ちょっと作り替えてみます.
#ノートPCでうまくいくのに,netwalkerでうまくいかないのはちょっと納得いきません.
#まさか,返信してくださるかたがいらっしゃるとは思わなかったので,netwalkerのカテゴリに似た質問をしてしまった・・・・
オフライン
想像ですが、デーモンレベルではbluetoothの起動が完了していても、デバイスレベルでの起動が完了していなくて自作プログラムのほうがエラーになるとは考えられませんか?
私はNetwalkerを持っているわけではありませんが、同じARMデバイスということでSmartQ5を持っておりまして、こちらの機種ではそう言うことがあったりして、デーモン起動のスクリプト内で自作プログラムの起動前に sleep 30 を入れて、30秒ほど遅延させて実行するようにしていたりします。
※自作プログラムでのエラーログ出力はどっちにしても必要かと
オフライン
gontomo による投稿:
想像ですが、デーモンレベルではbluetoothの起動が完了していても、デバイスレベルでの起動が完了していなくて自作プログラムのほうがエラーになるとは考えられませんか?
私はNetwalkerを持っているわけではありませんが、同じARMデバイスということでSmartQ5を持っておりまして、こちらの機種ではそう言うことがあったりして、デーモン起動のスクリプト内で自作プログラムの起動前に sleep 30 を入れて、30秒ほど遅延させて実行するようにしていたりします。
※自作プログラムでのエラーログ出力はどっちにしても必要かと
下記のプログラムのように,start関数にsleep 20を挟むと期待通りになりました.
デバイスレベルで起動していなかったみたいですね.
エラー処理も含めどうにかなりました.
ありがとうございました.
#管理者さまへ
#マルチポストのようなことをしてしまいすみませんでした.
---- autorun ----
#!/bin/sh
# chkconfig: 2345 91 91
# description: bluetooth daemon script.
. /lib/lsb/init-functions
PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/home/foofoo/Desktop/release/loop
DAEMON_NAME=`basename $DAEMON`
PIDFILE="/var/run/autorun.pid"
set -e
start() {
if start-stop-daemon --stop --quiet --pidfile ${PIDFILE} --signal 0
then
echo " already running."
exit
fi
sleep 20
start-stop-daemon --start --pidfile ${PIDFILE} --make-pidfile --quiet --background --exec ${DAEMON}
}
stop() {
start-stop-daemon --stop --pidfile ${PIDFILE}
}
case "$1" in
start)
echo -n "Starting $DAEMON_NAME:"
start
;;
stop)
echo -n "Stopping $DAEMON_NAME:"
stop
;;
restart)
echo -n "Restarting $DAEMON_NAME:"
stop
start
;;
status)
status_of_proc -p $PIDFILE $DAEMON $DAEMON_NAME && exit 0 || exit $?
;;
*)
echo $"Usage: $DAEMONNAME {start|stop|restart|status}" >&2
exit 1
;;
esac
exit 0
オフライン