[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gentoojp-users 85] Re: USBデバイスのhot-UNPLUGについて



  鈴木洋二でございます。
  先日の、USBデバイスの HOT-UNPLUG 時の動作について、スクリプトを追い
かけてみました。 

On Wed, 15 Jan 2003 22:16:04 +0900,
In article <20030115131734.0E2717823@xxxxxxxxxxxxxxxxxxxx>,
"己" == SUZUKI Youji <suzuki-youji@xxxxxxxxxxxxxx> writes:
	(中略)
己》  USBデバイスのケーブルを抜いたときの動作について相談したいことがあり
己》ます。
	(中略)
己》すが、どうも抜いたときに net.usb0 サービスが終了していないようなのです。

> Jan 14 22:34:02 centralpark /etc/hotplug/net.agent: invoke /etc/init.d/net.usb0 stop

己》というログは出ているので、hotplugから "/etc/init.d/net.usb0  stop" は
己》実行されていると思うのですが、なぜか次に start したときに WARNING にな
己》る。手動で "/etc/init.d/net.usb0 stop" を実行すれば、次に差したときは
己》WARNINGは出ないのですが。

  /sbin/runscript.sh から /etc/init.d/net.usb0 stop が実行される過程を
追ってみたところ、stop()関数の実行結果が 0 でない場合は
/mnt/.init.d/startd/net.usb0 のシンボリックリンクが再作成されていまし
た。
  USBを抜く前後でこのシンボリックリンクのタイムスタンプを比べてみたと
ころ、タイムスタンプが新しくなっていたので、stop() 関数の実行結果が0
でない、ということです。

  次に /etc/init.d/net.usb0 の stop()関数の最後の終了ステータスを確認
(echoで $? 変数をファイルに出力)してみました。

stop() {
        local myalias="$(get_options alias)"
        ebegin "Bringing ${IFACE} down"

        eend 0
	echo "usb0.stop()  eend result [$?]" >> /tmp/xxx.log
}

  この結果、$? が 1 となっていたので、このため
/mnt/.init.d/started/net.usb0 が再作成され、次の start で WARNING になっ
ている、と判明しました。

  問題は eend の戻り値が 1 となっていることで、eend の仕様がどう規定さ
れているのか分からないのですが、net.usb0(およびその元の net.eth0) では
"eend 0" の終了ステータスが 0 になることを期待しているように見えます。
  /sbin/functions.sh 中の eend() 関数では、

eend() {
        if [ "$#" -eq 0 ] || ([ -n "$1" ] && [ "$1" -eq 0 ])
        then
                if [ "${QUIET_STDOUT}" != "yes" ]
                then
                        echo -e "${ENDCOL}  \e[34;01m[ ${GOOD}ok \e[34;01m]${NORMAL}"
                fi
        else
                local returnme="$1"

		(中略)

                return ${returnme}
        fi
}
  となっていて、上の QUIET_STDOUTの内容と echo 文の終了ステータスを前
と同じようにechoでファイルに出力させたところ、QUIET_STDOUT は "no"、
echo 文の終了ステータスは "1" でした。
  したがって、ここが根本の原因と思われます。
  とりあえず、QUIET_STDOUT='yes'とすれば、echo を実行しないので、問題
を回避できる、と考えました。 

  /sbin/runscript.sh を見ると、コマンドライン引数に --quiet オプション
があると QUIET_STDOUT='yes' になるようなので、/etc/hotplug/net.agent
で /etc/init.d/net.$INTERFACE をコールする際に --quiet オプションを付
けるよう修正したところ、"eend 0" の終了ステータスが 0 となり、きちんと
終了処理が行われるようになりました。/mnt/.init.d/started/net.usb0 も後
始末されています。

  /etc/hotplug/net.agent 中で、/etc/inti.d/net.$INTERFACE の
start/stop を行う部分に修正を加えた diff を添付しておきます。

# 一応、本家の方にも報告しておこうと思います。
# 他の hotplug 機構に悪影響を与えないかどうかが気になりますが。
# net系のメッセージを出さないだけだから問題無いと思うのですが。

----------------------------------------------------------------------
                                suzuki-youji@xxxxxxxxxxxxxx  鈴木洋二
*** ./net.agent.ORIG	Sun Jan 19 18:20:20 2003
--- ./net.agent	Sun Jan 19 19:42:53 2003
***************
*** 43,49 ****
  	    # handle gentoo init script style
  	    if [ -x /etc/init.d/net.$INTERFACE ]; then
  		debug_mesg invoke /etc/init.d/net.$INTERFACE start
! 		exec /etc/init.d/net.$INTERFACE start
  	    # RedHat and similar
  	    elif [ -x /sbin/ifup ]; then
  		debug_mesg invoke ifup $INTERFACE
--- 43,49 ----
  	    # handle gentoo init script style
  	    if [ -x /etc/init.d/net.$INTERFACE ]; then
  		debug_mesg invoke /etc/init.d/net.$INTERFACE start
! 		exec /etc/init.d/net.$INTERFACE --quiet start
  	    # RedHat and similar
  	    elif [ -x /sbin/ifup ]; then
  		debug_mesg invoke ifup $INTERFACE
***************
*** 67,73 ****
  	    # handle gentoo init script style
  	    if [ -x /etc/init.d/net.$INTERFACE ]; then
  	        debug_mesg invoke /etc/init.d/net.$INTERFACE stop
! 		exec /etc/init.d/net.$INTERFACE stop
  	    # RedHat and similar
  	    elif [ -x /sbin/ifdown ]; then
  	        debug_mesg invoke ifdown $INTERFACE
--- 67,73 ----
  	    # handle gentoo init script style
  	    if [ -x /etc/init.d/net.$INTERFACE ]; then
  	        debug_mesg invoke /etc/init.d/net.$INTERFACE stop
! 		exec /etc/init.d/net.$INTERFACE --quiet stop
  	    # RedHat and similar
  	    elif [ -x /sbin/ifdown ]; then
  	        debug_mesg invoke ifdown $INTERFACE