Shell腳本殺掉除自己外的舊進程 在寫後臺Shell腳本的時候,這是比較常見的一個需求。比如之前運行了一個叫做a.sh的腳本在後臺運行,後來更新了a.sh腳本想重新運行,但卻不想手動殺掉已經存在的後臺a.sh進程。 命令其實非常簡單: 其中 是篩選出除腳本自己之外的舊進程的PID。 這裡的 做了些 ...
Shell腳本殺掉除自己外的舊進程
在寫後臺Shell腳本的時候,這是比較常見的一個需求。比如之前運行了一個叫做a.sh的腳本在後臺運行,後來更新了a.sh腳本想重新運行,但卻不想手動殺掉已經存在的後臺a.sh進程。
命令其實非常簡單:
kill $(pgrep -f "${0//./\\.}" | grep -v $BASHPID) &>/dev/null
其中pgrep -f $0 | grep -v $BASHPID
是篩選出除腳本自己之外的舊進程的PID。
這裡的$0
做了些處理,防止腳本路徑名稱中包含了點.
而導致模式匹配出現誤匹配。比如b.sh
腳本,在pgrep -f $0
時會匹配出b.sh和bash,${0//./\\.}
處理完後就得到了b\.sh
,這樣便不會匹配到bash,且沒有包含.
的路徑名稱也不會受到影響。