Merge pull request #796 from Lomanic/issue795

[process][darwin][openbsd][freebsd] Fix #795 don't truncate process names to 16 characters
pull/802/head
Lomanic 5 years ago committed by GitHub
commit f586a57353
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -8,6 +8,7 @@ import (
"encoding/binary" "encoding/binary"
"fmt" "fmt"
"os/exec" "os/exec"
"path/filepath"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -89,8 +90,24 @@ func (p *Process) NameWithContext(ctx context.Context) (string, error) {
if err != nil { if err != nil {
return "", err return "", err
} }
name := common.IntToString(k.Proc.P_comm[:])
return common.IntToString(k.Proc.P_comm[:]), nil if len(name) >= 15 {
cmdlineSlice, err := p.CmdlineSliceWithContext(ctx)
if err != nil {
return "", err
}
if len(cmdlineSlice) > 0 {
extendedName := filepath.Base(cmdlineSlice[0])
if strings.HasPrefix(extendedName, p.name) {
name = extendedName
} else {
name = cmdlineSlice[0]
}
}
}
return name, nil
} }
func (p *Process) Tgid() (int32, error) { func (p *Process) Tgid() (int32, error) {
return 0, common.ErrNotImplementedError return 0, common.ErrNotImplementedError

@ -7,6 +7,7 @@ import (
"context" "context"
"encoding/binary" "encoding/binary"
"os/exec" "os/exec"
"path/filepath"
"strconv" "strconv"
"strings" "strings"
@ -58,8 +59,24 @@ func (p *Process) NameWithContext(ctx context.Context) (string, error) {
if err != nil { if err != nil {
return "", err return "", err
} }
name := common.IntToString(k.Comm[:])
return common.IntToString(k.Comm[:]), nil if len(name) >= 15 {
cmdlineSlice, err := p.CmdlineSliceWithContext(ctx)
if err != nil {
return "", err
}
if len(cmdlineSlice) > 0 {
extendedName := filepath.Base(cmdlineSlice[0])
if strings.HasPrefix(extendedName, p.name) {
name = extendedName
} else {
name = cmdlineSlice[0]
}
}
}
return name, nil
} }
func (p *Process) Tgid() (int32, error) { func (p *Process) Tgid() (int32, error) {
return 0, common.ErrNotImplementedError return 0, common.ErrNotImplementedError

@ -8,6 +8,7 @@ import (
"context" "context"
"encoding/binary" "encoding/binary"
"os/exec" "os/exec"
"path/filepath"
"strconv" "strconv"
"strings" "strings"
"unsafe" "unsafe"
@ -61,8 +62,24 @@ func (p *Process) NameWithContext(ctx context.Context) (string, error) {
if err != nil { if err != nil {
return "", err return "", err
} }
name := common.IntToString(k.Comm[:])
return common.IntToString(k.Comm[:]), nil if len(name) >= 15 {
cmdlineSlice, err := p.CmdlineSliceWithContext(ctx)
if err != nil {
return "", err
}
if len(cmdlineSlice) > 0 {
extendedName := filepath.Base(cmdlineSlice[0])
if strings.HasPrefix(extendedName, p.name) {
name = extendedName
} else {
name = cmdlineSlice[0]
}
}
}
return name, nil
} }
func (p *Process) Tgid() (int32, error) { func (p *Process) Tgid() (int32, error) {
return 0, common.ErrNotImplementedError return 0, common.ErrNotImplementedError

@ -2,10 +2,12 @@ package process
import ( import (
"fmt" "fmt"
"io/ioutil"
"net" "net"
"os" "os"
"os/exec" "os/exec"
"os/user" "os/user"
"path/filepath"
"reflect" "reflect"
"runtime" "runtime"
"strconv" "strconv"
@ -289,6 +291,51 @@ func Test_Process_Name(t *testing.T) {
t.Errorf("invalid Exe %s", n) t.Errorf("invalid Exe %s", n)
} }
} }
func Test_Process_Long_Name(t *testing.T) {
tmpdir, err := ioutil.TempDir("", "")
if err != nil {
t.Fatalf("unable to create temp dir %v", err)
}
defer os.RemoveAll(tmpdir) // clean up
tmpfilepath := filepath.Join(tmpdir, "looooooooooooooooooooong.go")
tmpfile, err := os.Create(tmpfilepath)
if err != nil {
t.Fatalf("unable to create temp file %v", err)
}
tmpfilecontent := []byte("package main\nimport(\n\"time\"\n)\nfunc main(){\nfor range time.Tick(time.Second) {}\n}")
if _, err := tmpfile.Write(tmpfilecontent); err != nil {
tmpfile.Close()
t.Fatalf("unable to write temp file %v", err)
}
if err := tmpfile.Close(); err != nil {
t.Fatalf("unable to close temp file %v", err)
}
err = exec.Command("go", "build", "-o", tmpfile.Name()+".exe", tmpfile.Name()).Run()
if err != nil {
t.Fatalf("unable to build temp file %v", err)
}
cmd := exec.Command(tmpfile.Name() + ".exe")
assert.Nil(t, cmd.Start())
time.Sleep(100 * time.Millisecond)
p, err := NewProcess(int32(cmd.Process.Pid))
skipIfNotImplementedErr(t, err)
assert.Nil(t, err)
n, err := p.Name()
skipIfNotImplementedErr(t, err)
if err != nil {
t.Fatalf("getting name error %v", err)
}
basename := filepath.Base(tmpfile.Name() + ".exe")
if basename != n {
t.Fatalf("%s != %s", basename, n)
}
cmd.Process.Kill()
}
func Test_Process_Exe(t *testing.T) { func Test_Process_Exe(t *testing.T) {
p := testGetProcess() p := testGetProcess()
@ -456,7 +503,14 @@ func Test_Children(t *testing.T) {
if len(c) == 0 { if len(c) == 0 {
t.Fatalf("children is empty") t.Fatalf("children is empty")
} }
if c[0].Pid != int32(cmd.Process.Pid) { found := false
for _, child := range c {
if child.Pid == int32(cmd.Process.Pid) {
found = true
break
}
}
if !found {
t.Errorf("could not find child %d", cmd.Process.Pid) t.Errorf("could not find child %d", cmd.Process.Pid)
} }
} }
@ -549,8 +603,10 @@ func Test_IsRunning(t *testing.T) {
} }
cmd.Start() cmd.Start()
p, err := NewProcess(int32(cmd.Process.Pid)) p, err := NewProcess(int32(cmd.Process.Pid))
skipIfNotImplementedErr(t, err)
assert.Nil(t, err) assert.Nil(t, err)
running, err := p.IsRunning() running, err := p.IsRunning()
skipIfNotImplementedErr(t, err)
if err != nil { if err != nil {
t.Fatalf("IsRunning error: %v", err) t.Fatalf("IsRunning error: %v", err)
} }
@ -559,6 +615,7 @@ func Test_IsRunning(t *testing.T) {
} }
cmd.Wait() cmd.Wait()
running, err = p.IsRunning() running, err = p.IsRunning()
skipIfNotImplementedErr(t, err)
if err != nil { if err != nil {
t.Fatalf("IsRunning error: %v", err) t.Fatalf("IsRunning error: %v", err)
} }

Loading…
Cancel
Save