mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2025-02-08 01:20:07 +08:00
fix: 解决容器进程异常退出的问题 (#1124)
This commit is contained in:
parent
be6b7157f4
commit
d7c08295f8
@ -5,8 +5,8 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os/exec"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
|
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
|
||||||
@ -112,11 +112,12 @@ func (b *BaseApi) RedisWsSsh(c *gin.Context) {
|
|||||||
if len(redisConf.Requirepass) != 0 {
|
if len(redisConf.Requirepass) != 0 {
|
||||||
commands = fmt.Sprintf("redis-cli -a %s --no-auth-warning", redisConf.Requirepass)
|
commands = fmt.Sprintf("redis-cli -a %s --no-auth-warning", redisConf.Requirepass)
|
||||||
}
|
}
|
||||||
|
pidMap := loadMapFromDockerTop(redisConf.ContainerName)
|
||||||
slave, err := terminal.NewCommand(fmt.Sprintf("docker exec -it %s %s", redisConf.ContainerName, commands))
|
slave, err := terminal.NewCommand(fmt.Sprintf("docker exec -it %s %s", redisConf.ContainerName, commands))
|
||||||
if wshandleError(wsConn, err) {
|
if wshandleError(wsConn, err) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer killBash(redisConf.ContainerName, commands)
|
defer killBash(redisConf.ContainerName, commands, pidMap)
|
||||||
defer slave.Close()
|
defer slave.Close()
|
||||||
|
|
||||||
tty, err := terminal.NewLocalWsSession(cols, rows, wsConn, slave)
|
tty, err := terminal.NewLocalWsSession(cols, rows, wsConn, slave)
|
||||||
@ -175,11 +176,12 @@ func (b *BaseApi) ContainerWsSsh(c *gin.Context) {
|
|||||||
if len(user) != 0 {
|
if len(user) != 0 {
|
||||||
commands = fmt.Sprintf("docker exec -it -u %s %s %s", user, containerID, command)
|
commands = fmt.Sprintf("docker exec -it -u %s %s %s", user, containerID, command)
|
||||||
}
|
}
|
||||||
|
pidMap := loadMapFromDockerTop(containerID)
|
||||||
slave, err := terminal.NewCommand(commands)
|
slave, err := terminal.NewCommand(commands)
|
||||||
if wshandleError(wsConn, err) {
|
if wshandleError(wsConn, err) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer killBash(containerID, command)
|
defer killBash(containerID, command, pidMap)
|
||||||
defer slave.Close()
|
defer slave.Close()
|
||||||
|
|
||||||
tty, err := terminal.NewLocalWsSession(cols, rows, wsConn, slave)
|
tty, err := terminal.NewLocalWsSession(cols, rows, wsConn, slave)
|
||||||
@ -219,13 +221,40 @@ func wshandleError(ws *websocket.Conn, err error) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func killBash(containerID, comm string) {
|
func loadMapFromDockerTop(containerID string) map[string]string {
|
||||||
sudo := ""
|
pidMap := make(map[string]string)
|
||||||
if cmd.HasNoPasswordSudo() {
|
sudo := cmd.SudoHandleCmd()
|
||||||
sudo = "sudo"
|
|
||||||
|
stdout, err := cmd.Execf("%s docker top %s -eo pid,command ", sudo, containerID)
|
||||||
|
if err != nil {
|
||||||
|
return pidMap
|
||||||
|
}
|
||||||
|
lines := strings.Split(stdout, "\n")
|
||||||
|
for _, line := range lines {
|
||||||
|
parts := strings.Fields(line)
|
||||||
|
if len(parts) != 2 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
pidMap[parts[0]] = parts[1]
|
||||||
|
}
|
||||||
|
return pidMap
|
||||||
|
}
|
||||||
|
|
||||||
|
func killBash(containerID, comm string, pidMap map[string]string) {
|
||||||
|
sudo := cmd.SudoHandleCmd()
|
||||||
|
newPidMap := loadMapFromDockerTop(containerID)
|
||||||
|
for pid, command := range newPidMap {
|
||||||
|
isOld := false
|
||||||
|
for pid2 := range pidMap {
|
||||||
|
if pid == pid2 {
|
||||||
|
isOld = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !isOld && command == comm {
|
||||||
|
_, _ = cmd.Execf("%s kill -9 %s", sudo, pid)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
command := exec.Command("sh", "-c", fmt.Sprintf("%s kill -9 $(docker top %s -eo pid,command | grep '%s' | awk '{print $1}')", sudo, containerID, comm))
|
|
||||||
_, _ = command.CombinedOutput()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var upGrader = websocket.Upgrader{
|
var upGrader = websocket.Upgrader{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user