Shell腳本判斷進程是否存在的實現(xiàn)示例
背景
需要一個shell 腳本檢測一下進程是否存在,如果存在則直接kill 掉
問題處理
查看進程id
ps -ef|grep node_exporter|grep -v grep|awk '{print $2}'如果應用進程是存在的且只有一個進程,在腳本中打印會發(fā)現(xiàn)有三個進程id,其中有兩個進程是用不到的,且多出來的兩個進程id和當前腳本子進程相關,為什么會有兩個無關的進程id呢?理論上來講主機上只有這一個關鍵詞的進程,排查發(fā)現(xiàn)是因為定義的腳本名稱包含了node_exporter所導致。
知識點補充
shell腳本在執(zhí)行時,會啟動子shell的進程。作為主shell的子進程,子shell將shell腳本中的命令作為批處理運行(因此稱為“批處理進程”)。
在bash中,子shell進程的PID存儲在一個特殊的變量‘$$’中。這個變量只讀,你不可以在腳本中修改它。
除了$$, bash shell還會導出其他的只讀變量。比如,PPID存儲子shell父進程的ID(也就是主shell)。UID存儲了執(zhí)行這個腳本的當前用戶ID
echo $PPID echo UID
解決方法
優(yōu)化獲取進程id方式
ps -ef|grep node_exporter|grep -v grep|grep -v $$|awk '{print $2}'這樣獲得的進程就會過濾掉當前腳本的進程,問題處理
腳本偽代碼供參考
# 檢查 node_exporter 進程是否存在,存在則直接kill 掉
check_node_exporter_status(){
echo "check node exporter status start "
node_exporer_proc=`ps -ef|grep node_exporter|grep -v grep|grep -v $$|awk '{print $2}'`
if [[ $node_exporer_proc != "" ]]; then
echo "node_exporter process id is $node_exporer_proc"
sudo kill $node_exporer_proc
fi
echo "check node exporter status end "
}到此這篇關于Shell腳本判斷進程是否存在的實現(xiàn)示例的文章就介紹到這了,更多相關Shell判斷進程存在內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
執(zhí)行shell 腳本將日志全部輸出到文件的多種方法
執(zhí)行Shell腳本時,可將所有輸出(stdout+stderr)重定向到日志文件,方法包括直接重定向(> 2>&1)、追加模式(>>)、tee命令(屏幕+文件)、腳本內重定向(exec)及l(fā)ogger系統(tǒng)日志,推薦方法1或2,結合logrotate管理日志大小2025-07-07

