2013年11月5日 星期二

如何在系統開機或關機時通知網路上的其他機器

許多系統偵測的協定,都定義需在系統開機以及將關機時,透過網路送出訊息通知周遭的設備。
例如:WS-Discovery spec 定義,開機時應該送出 Hello,關機時應該送出 Bye。

那麼如何讓系統在開關機時,呼叫程式,作對應的處理?

以下以 wsdiscovery為例,說明 Linux 系統下的作法

一、開機時自動執行某程式。
以 Linux 而言,可以寫一個 script 放在/etc/init.d.,例如: wsdiscovery.sh,此script會執行wsdiscovery 執行檔。
接著在對應的執行目錄內,建立 symbolic link,例如若開機時的inittab設定為level 5,就將檔案放在 /etc/init.d/rc5.d
例如:
   /etc/init.d/rc5.d/S90wsdiscovery,此處S表示Start,90為執行順序
   /etc/init.d/rc5.d/K99wsdiscovery,此處K表示stop(Kill),99為執行順序
   注意:wsdiscovery.sh 會用到網路服務,所以要在網路服務啓動之後執行。

二、程式中如何偵測系統即將關閉,並作對應的處理。
linux 正常關機時,通常會使用下列幾個命令,
shutdown, reboot, halt, poweroff
一般而言,當關機時,所有的 process 都應該會先收到 SIGTERM,接著收到 SIGKILL。 
因此可以在 wsdiscovery 執行檔內,針對這些 signal 註冊 signal handler,當收到signal就送出Bye。 
問題在於當 process 收到 SIGTERM 時,是否此時網路服務已經先中斷了?若網路服務已經消失,那麼也無法送出 Bye 了。 
根據IBM這篇文章,系統送出 SIGTERM後,會隔五秒才送出SIGKILL,因此wsdiscovery應該是可以在網路服務被中斷之前送出 Bye。

參考資料: 

  1. http://www.ibm.com/developerworks/linux/library/l-lpic1-v3-101-3/