お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2010-09-04 01:36:30

koachi
メンバ
登録日: 2008-05-03

デーモンの起動順序

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

オフライン

 

#2 2010-09-04 01:39:56

koachi
メンバ
登録日: 2008-05-03

Re: デーモンの起動順序

追記です.

OS起動時にこのプログラムをデーモンとして起動はできませんが,OS起動終了後に
$ sudo /etc/init.d/hogehoge start
とすると期待通りに起動することができました.

ですが,相変わらずOS起動した瞬間にき

オフライン

 

#3 2010-09-04 11:24:04

Tako090929
メンバ
登録日: 2009-09-29

Re: デーモンの起動順序

gentoo という distritution ではデーモンプログラムをコンパイルした後に、
rc-update add xxx default のような操作をします。
ubuntu での正しい操作は分かりませんが、
/etc/rc5.d あたりにシンボリックリンクを作ってみてはいかかでしょう。

オフライン

 

#4 2010-09-04 13:01:06

hito
管理者
登録日: 2007-03-18

Re: デーモンの起動順序

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

オフライン

 

#5 2010-09-04 20:55:24

koachi
メンバ
登録日: 2008-05-03

Re: デーモンの起動順序

返信ありがとうございます.

実はこのデーモンnetwalkerで動かそうとして,ノートPCで試しているところなんです.

$ sudo update-rc.d ssh defaults 99

このように実行したところノートPCでは期待通りに動いてくれたのですが,
netwalkerに移したところ,空ファイルが作成されただけです
#起動後に
#$ sudo /etc/init.d/hogehoge start
#このようにすると期待通りの動きになりました.

うまくいく可能性がもうちょっとありそうなので,INIT INFOを試してみます.

オフライン

 

#6 2010-09-04 21:30:39

koachi
メンバ
登録日: 2008-05-03

Re: デーモンの起動順序

### BEGIN INIT INFO
# Required-Start:    bluetoothd
# Required-Stop:     
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

このように記述したところ,改善されませんでした.

オフライン

 

#7 2010-09-06 06:56:20

ry
メンバ
登録日: 2008-07-30

Re: デーモンの起動順序

koachi さんの投稿 (#1):

予想ではbluetoothのデーモンが起動するまえに,今回のプログラムのデーモンが起動してしまってエラー終了してると思います.
bluetoothのデーモンが起動したあとに今回のプログラムを起動したいのですが,

デーモンの起動順序を云々する前に、自作プログラムがエラー終了する正確な原因を追及した方が良いのではないでしょうか

bluetooth のデーモンを停止した状態で、自作プログラムを実行するとどうなりますか?
bluetooth のデーモンを開始した直後に、自作プログラムを実行するとどうなりますか?
場合によっては、bluetooth のデーモンの起動と連続して自作プログラムを実行して確認することも必要かもしれません

# そもそも自作プログラム自身のエラーログを吐くようにしてはどうかという気もしないではない

オフライン

 

#8 2010-09-06 07:40:51

koachi
メンバ
登録日: 2008-05-03

Re: デーモンの起動順序

ry による投稿:

デーモンの起動順序を云々する前に、自作プログラムがエラー終了する正確な原因を追及した方が良いのではないでしょうか

bluetooth のデーモンを停止した状態で、自作プログラムを実行するとどうなりますか?
bluetooth のデーモンを開始した直後に、自作プログラムを実行するとどうなりますか?
場合によっては、bluetooth のデーモンの起動と連続して自作プログラムを実行して確認することも必要かもしれません

# そもそも自作プログラム自身のエラーログを吐くようにしてはどうかという気もしないではない

bluetoothのデーモンを停止した状態ですと,空ファイルが作成されただけです.
bluetoothのデーモンを開始した直後ですと,期待通りです.

デーモンとして登録するまえに,端末上で動作が期待通りだったので,エラーログの出力をおこたっていました.
ちょっと作り替えてみます.

#ノートPCでうまくいくのに,netwalkerでうまくいかないのはちょっと納得いきません.
#まさか,返信してくださるかたがいらっしゃるとは思わなかったので,netwalkerのカテゴリに似た質問をしてしまった・・・・

オフライン

 

#9 2010-09-06 08:59:51

gontomo
メンバ
From: 北海道
登録日: 2010-02-17

Re: デーモンの起動順序

想像ですが、デーモンレベルではbluetoothの起動が完了していても、デバイスレベルでの起動が完了していなくて自作プログラムのほうがエラーになるとは考えられませんか?
私はNetwalkerを持っているわけではありませんが、同じARMデバイスということでSmartQ5を持っておりまして、こちらの機種ではそう言うことがあったりして、デーモン起動のスクリプト内で自作プログラムの起動前に sleep 30 を入れて、30秒ほど遅延させて実行するようにしていたりします。

※自作プログラムでのエラーログ出力はどっちにしても必要かと

オフライン

 

#10 2010-09-06 16:37:26

koachi
メンバ
登録日: 2008-05-03

Re: デーモンの起動順序

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

オフライン

 

Board footer

Powered by FluxBB