許多系統偵測的協定,都定義需在系統開機以及將關機時,透過網路 送出訊息通知周遭的設備。
例如: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。
參考資料:
- http://www.ibm.com/developerworks/linux/library/l-lpic1-v3-101-3/