mirror of
https://github.com/shirou/gopsutil.git
synced 2025-04-24 13:48:56 +08:00
[process][posix] Realign process.Name() with python psutil to return same value on python3 scripts processes
e2c79a1 started to blindly set the process name to the full path (instead of the basename) of the cmdline exectuable if the process name from the process comm was truncated on linux. Python psutil never did that, and this is just wrong for python (or any executable interpreted script) where the process name is not the interpreter binary but the script itself. A new test to check process name value against psutil value is added here, which would hopefully catch any potential future changes in psutil. Reverts #542 Fixes #1485
This commit is contained in:
parent
c0f3eb1dfb
commit
8b96d2e9e2
@ -82,8 +82,6 @@ func (p *Process) NameWithContext(ctx context.Context) (string, error) {
|
||||
extendedName := filepath.Base(cmdName)
|
||||
if strings.HasPrefix(extendedName, p.name) {
|
||||
name = extendedName
|
||||
} else {
|
||||
name = cmdName
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -55,8 +55,6 @@ func (p *Process) NameWithContext(ctx context.Context) (string, error) {
|
||||
extendedName := filepath.Base(cmdlineSlice[0])
|
||||
if strings.HasPrefix(extendedName, p.name) {
|
||||
name = extendedName
|
||||
} else {
|
||||
name = cmdlineSlice[0]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -845,8 +845,6 @@ func (p *Process) fillFromStatusWithContext(ctx context.Context) error {
|
||||
extendedName := filepath.Base(cmdlineSlice[0])
|
||||
if strings.HasPrefix(extendedName, p.name) {
|
||||
p.name = extendedName
|
||||
} else {
|
||||
p.name = cmdlineSlice[0]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -60,8 +60,6 @@ func (p *Process) NameWithContext(ctx context.Context) (string, error) {
|
||||
extendedName := filepath.Base(cmdlineSlice[0])
|
||||
if strings.HasPrefix(extendedName, p.name) {
|
||||
name = extendedName
|
||||
} else {
|
||||
name = cmdlineSlice[0]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
package process
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
@ -391,6 +392,62 @@ func Test_Process_Long_Name(t *testing.T) {
|
||||
cmd.Process.Kill()
|
||||
}
|
||||
|
||||
func Test_Process_Name_Against_Python(t *testing.T) {
|
||||
if runtime.GOOS == "windows" {
|
||||
t.Skip("only applies to posix")
|
||||
}
|
||||
py3Path, err := exec.LookPath("python3")
|
||||
if err != nil {
|
||||
t.Skipf("python3 not found: %s", err)
|
||||
}
|
||||
if out, err := exec.Command(py3Path, "-c", "import psutil").CombinedOutput(); err != nil {
|
||||
t.Skipf("psutil not found for %s: %s", py3Path, out)
|
||||
}
|
||||
|
||||
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.py")
|
||||
tmpfile, err := os.Create(tmpfilepath)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to create temp file %v", err)
|
||||
}
|
||||
tmpfilecontent := []byte("#!" + py3Path + "\nimport psutil, time\nprint(psutil.Process().name(), flush=True)\nwhile True:\n\ttime.sleep(1)")
|
||||
if _, err := tmpfile.Write(tmpfilecontent); err != nil {
|
||||
tmpfile.Close()
|
||||
t.Fatalf("unable to write temp file %v", err)
|
||||
}
|
||||
if err := tmpfile.Chmod(0o744); err != nil {
|
||||
t.Fatalf("unable to chmod u+x temp file %v", err)
|
||||
}
|
||||
if err := tmpfile.Close(); err != nil {
|
||||
t.Fatalf("unable to close temp file %v", err)
|
||||
}
|
||||
cmd := exec.Command(tmpfilepath)
|
||||
outPipe, _ := cmd.StdoutPipe()
|
||||
scanner := bufio.NewScanner(outPipe)
|
||||
cmd.Start()
|
||||
defer cmd.Process.Kill()
|
||||
scanner.Scan()
|
||||
pyName := scanner.Text() // first line printed by py3 script, its name
|
||||
t.Logf("pyName %s", pyName)
|
||||
p, err := NewProcess(int32(cmd.Process.Pid))
|
||||
skipIfNotImplementedErr(t, err)
|
||||
if err != nil {
|
||||
t.Fatalf("getting process error %v", err)
|
||||
}
|
||||
name, err := p.Name()
|
||||
skipIfNotImplementedErr(t, err)
|
||||
if err != nil {
|
||||
t.Fatalf("getting name error %v", err)
|
||||
}
|
||||
if pyName != name {
|
||||
t.Fatalf("psutil and gopsutil process.Name() results differ: expected %s, got %s", pyName, name)
|
||||
}
|
||||
}
|
||||
|
||||
func Test_Process_Exe(t *testing.T) {
|
||||
p := testGetProcess()
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user