需求背景
- 有一些项目使用windows做服务器,开启了一堆进程,然后需要重启其中一个,不知道在哪。可以用命令
netstat -ano
和taskkill -PID pid -F
来杀进程,还是相对麻烦。可以用以下程序简化步骤。
package main
import (
"fmt"
"golang.org/x/text/encoding/simplifiedchinese"
"os"
"os/exec"
"strings"
)
//main 根据端口找到服务并杀死对应进程
func main() {
if len(os.Args) < 2 {
fmt.Println("缺少端口参数")
}
c1 := exec.Command("powershell.exe", "netstat", "-ano")
output, _ := c1.CombinedOutput()
decodeBytes, _ := simplifiedchinese.GB18030.NewDecoder().Bytes(output)
strNetstat := string(decodeBytes)
Port := os.Args[1]
Pid := "0"
for _, v := range strings.Split(strNetstat, "\r\n") {
for {
if strings.Contains(v, " ") {
v = strings.ReplaceAll(v, " ", " ")
} else {
break
}
}
strings.Trim(v, " ")
arrTmp := strings.Split(v, " ")
arr := make([]string, 0)
for _, vv := range arrTmp {
if vv != "" {
arr = append(arr, vv)
}
}
if len(arr) == 5 && fmt.Sprintf("0.0.0.0:%v", Port) == arr[1] {
Pid = arr[4]
break
}
}
if Pid == "0" {
fmt.Printf("没找到端口号为%v的服务\n", Port)
return
}
c2 := exec.Command("powershell.exe", "taskkill -PID ", Pid, "-F")
output, _ = c2.CombinedOutput()
decodeBytes, _ = simplifiedchinese.GB18030.NewDecoder().Bytes(output)
delStr := string(decodeBytes)
fmt.Printf("找到端口为%v的服务,%s\n", Port, delStr)
}
运行结果
-
1.起一个端口为8081的本地服务进程,然后执行
main.exe 8081
来检验杀死相应服务进程。
-
- 再执行一遍
main.exe 8081
,检验缺少对应端口进程提示正确。
- 再执行一遍
-