如何用指令碼可靠關閉一個linux服務或程序
阿新 • • 發佈:2020-12-15
技術標籤:Linux
一、指令碼樣例
以quectel的EC20模組關閉ppp撥號服務指令碼為例,以下為指令碼原始碼:
#!/bin/sh
timeout=5
killall -15 pppd
sleep 1
killall -0 pppd
while [ $? -eq 0 ]
do
timeout=`expr $timeout - 1`
if [ $timeout -eq 0 ]
then
exit 1
fi
sleep 1
killall -0 pppd
done
if [ $? -ne 0 ]
then
killall -9 pppd
fi
二、程式碼解釋
kill 後跟pid來結束程序; killall 後跟服務名稱/程序名稱來結束程序。
kill/killall後邊跟的數字含義見下圖
killall -15 pppd : 給pppd程序傳送SIGTERM訊號,通知該程序自己實現退出,但該程式可能在執行IO,不一定能及時響應,因此有可能被阻塞。
sleep 1: 延時1s,等待pppd自我實現退出,此時不一定能成功。
killall -0 pppd : 傳送-0 的含義是判斷當前程序或服務是否存在, 該程序或服務不作任何響應,如果返回0則服務存在,否則服務不存在。
while [ $? -eq 0 ] : shell 指令碼的while迴圈控制,$?表示上一條語句執行結果。
exit 1: 退出while,並返回while的執行結果為1,一般表明異常退出,此處的含義為5秒內pppd沒有正常退出。
if [ $? -ne 0 ]:判斷while執行的結果,如果不為0,則執行if內容;
killall -9 pppd:傳送SIGKILL訊號給pppd,無條件退出,強制退出程序,該訊號不可忽略或被程序捕獲。